链接:https://zhuanlan.zhihu.com/p/23726515
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
声明:
-
文中内容收集整理自《C++ Primer 中文版 (第5版)》,版权归原书所有。
-
原书有更加详细、精彩的释义,请大家购买正版书籍进行学习。
-
本文仅作学习交流使用,禁止任何形式的转载
形参初始化的机理与变量初始化一样
值传递和引用传递
-
如果形参是引用类型,它将绑定到对应的实参上
-
否则,将实参的值拷贝后赋给形参
指针也遵从上面的规则,调用函数时将指针形参的值拷贝后赋给指针形参,它们是两个指针,但是指向同一个对象
传递引用可以避免对象的拷贝,因此建议尽量使用引用传递
如果不需要改变引用形参的值,最好使用常量引用,它能接受的实参类型比普通引用多
-
普通引用只接受同类型的对象作为初始值
-
常量引用可以用同类型对象、表达式、字面值初始化
如果函数需要多个返回值,可以使用引用形参来返回额外信息
const形参和实参
void fcn( const int i);
void fcn( int i );
并不能构成函数重载,因为和其它初始化过程一样,会忽略掉形参的顶层const。也就是说实参是常量或非常量都可以
数组形参
数组有两个特殊的性质
-
不支持拷贝
-
数组名通常会自动转化为指针
也使得数组形参变得特殊
void print( const int* );
void print( const int[] );
void print( const int[10] );
主观上我们会以为这三个是不同的定义,然而后面两个也会自动转化为const int *来处理
在调用时,实参可以是数组名,也可以是整形指针
因为形参只是整型指针,所以数组的维度是没有传递到函数中的。有三种方法来解决这一问题
-
传递首元素和尾后元素的指针
-
增加一个参数,传递数组的大小
-
使用数组引用形参
数组引用形参
void print(int (&arr)[10] );
不过这种定义也限制了我们只能传递维度为10的数组
多维数组
前面提到多维数组其实就是数组的数组,首元素是指向数组的指针
void print(int matrix[10][10], int rowSize);
为什么要传递rowSize进去呢?
我们知道数组会自动转化为指针,这里也不例外,上面的定义的本质是
void print(int (*matrix)[10], int rowSize);
因此需要rowSize来指明二维数组的第一个维度
main函数的形参
main函数是熟悉数组形参最好的例子
int main(int argc, char *argv[]) {}
第二个形参被声明为char *的数组,意味个我们可以传递多个字符串,而具体个数由argc指定
也可以定义为
int main( int argc, char **argv ) {}