How Arguments Are Passed

Parameter initialization works the same way as variable initialization.

所以类似的,the type of a parameter determines the interaction between the parameter and its argument. (也就是说,如果用了reference,那parameter和argument就绑住了)

“passed (called) by reference” “passed (called) by value”

⚠️ access objects outside a function: C often use pointer, while C++ generally use reference.

Call-by-Value

Array parameters

由于第一行,而数组不能拿来赋值,所以我们没办法把“数组这个变量的值”传入。

所以C++都会把parameter list中的数组全部解释为指针
(就算第一句话说的跟普通变量初始化一样。一样是一样,但是从根本上已经解释为指针了)

⚠️ 由于传入的实际上是指针,所以对于数组到底有多大,函数是不知道的
(常用的方法有C-style String的方法、再传入一个指明大小的parameter、使用begin end这种自带的指示变量)

⚠️ 同样的,如果数组内容不变,那就pointer to const;也有reference to array,这种时候就是可以把array这个object拿来用了 (当然,此时的dimension是重要的)

Passing a Multidimensional Array

由于多维数组是 元素为数组的数组,而我们已经知道了只能传指针,所以传的是指向数组的指针。(也因此内层的dimension必须标明)

Function Pointer Parameters

跟数组同理,也是传指针:

void f(bool pf(int, int));
void f(bool (*pf)(int, int));  // equivalent

注意到这两个写法意义是一样的,浅理解一下:

  • 第一个我们按照一个函数的写法写进去,会被转化为指针,这个情况是和数组一样的,不要大惊小怪
  • 第二个情况就是正儿八经指针写法

Call-by-Reference

Call-by-Constant-Reference

  1. Reference parameters that are not changed inside a function should be references to const.

(并且最好一定要加上 const 就算你对自己的程序很有自信。不然你放不进一个literal和本身就是。回忆第一句话,reference的定义是比较严格的)

  1. 啰嗦一句:就算别的type在const的情况下也能传入普通变量,在reference这里就是不行。(原因很简单,因为第一句话)

Call-by-Rvalue-Reference

rvalue 存放的是 temp,主要就是为了防止过度开销 (不懂,以后再说)


main: Handling Command-Line Options

感觉是高阶操作,以后再学吧

就是当运行这个程序的时候,终端给的一些参数

Functions with Varying Parameters

initializer_list Parameters

Ellipsis Parameters

以后再学吧