《C++ Primer》读书笔记-第六章 02参数传递

作者:马志峰
链接: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 ) {}

猜你喜欢

转载自blog.csdn.net/qq_26751117/article/details/53233451
今日推荐