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
- Reference parameters that are not changed inside a function should be references to
const
.
(并且最好一定要加上 const
就算你对自己的程序很有自信。不然你放不进一个literal和本身就是。回忆第一句话,reference的定义是比较严格的)
- 啰嗦一句:就算别的type在const的情况下也能传入普通变量,在reference这里就是不行。(原因很简单,因为第一句话)
Call-by-Rvalue-Reference
rvalue 存放的是 temp,主要就是为了防止过度开销 (不懂,以后再说)
main
: Handling Command-Line Options
感觉是高阶操作,以后再学吧
就是当运行这个程序的时候,终端给的一些参数
Functions with Varying Parameters
initializer_list Parameters
Ellipsis Parameters
以后再学吧