参数传递
参数传递有两种方式,即值传递和引用传递。
按值传递不是在所有的情况下都适合。不适合的情况包括:
(1)当大型的类对象必须作为参数传递时。由于拷贝对象带来的开销会过大。
(2)当实参的值必须被修改时。
1、引用参数
1.1 使用引用参数的场合
(1)必须修改实参的值而避免使用指针的时候。
例如交换两个变量的值:
(2) 向主调函数返回额外的结果,很显而易见。
(3) 向函数传递大型对象。
Tip: 若希望用引用参数以避免拷贝用作实参的大型类对象,同时又希望防止函数修改实参的值。如果引用参数不希望在被调用的函数内部被修改,那么把参数生命为const型的引用是个不错的办法。
int foo (const X& xx){...}
1.2 指针的引用
主要用于要修改指针本身的时候
1.3 引用和指针参数的关系
引用必须被初始化为指向一个对象(不可以用常数作引用参数的实参),一旦初始化了,它就不能再指向其他对象。指针可以指向一系列不同的对象也可以什么都不指向。
一个Matrix对象重载加法运算符实现的例子:
2 数组参数
数组的长度与参数声明无关。下面三个声明是等价的:
问题:传递数组给函数时使其知道它的长度
方法一:提供一个含有数组长度的额外参数,很常用
方法二:将参数声明为数组的引用。当参数是一个数组的类型的引用时,数组长度成为参数和实参类型的一部分,编译器检查数组实参的长度与在函数参数类型中指定的长度是否匹配。
方法三:使用抽象容器类型作为参数, vector<int> vec;
3 函数指针
声明、初始化、调用函数指针:
函数指针的数组:
函数指针作参数: