C++函数参数参数初始化

参数的初始化:已知函数void foo( X x0);
下面这样调用函数
X xx;
foo(xx);
则其中一种实现策略是导入临时性object,并调用copy constructor将它初始化,然后将此临时性object交给函数,如下:
X _temp0;
_temp0.X::X( xx );
foo( _temp0 );
但这样的转换还不到位,foo()的声明也需要被转化,形式参数必须从原先的一个class X object改变为class X 引用。如下:
void foo( X& x0);
在foo函数完成后,会掉用析构函数对付临时性的object。

问题:
为什么foo()的声明必须转化为引用?

以引用方式和复制方式来传递参数是不一样的。引用方式就相当于在函数中创建了这个变量或对象的一个别名,它们是共用一个内存空间的。
而复制方式会将实参的值复制给形参,如果只是普通类型是没有问题的,但如果是类复制,并且这个类含有指针变量,那么就会造成浅复制,这是很危险的。
另外,只有在实例之间进行复制的时候才会调用复制构造函数,而且如果是按引用方式来传递参数,是不会调用析构函数的。

对于这个问题,即使你采用了临时性 的对象,但只是将一次复制变为了两次复制,那么如果你的类X里包含了指针变量,而在复制构造函数里没有很好的处理指针变量所指向内存空间的复制问题,最终还是会出现问题。

如果有表述不清或不对的地方,请见谅。

用引用就是可以减少拷贝构造。这样就直接引用到了xx的引用作为参数,不需要额外的临时对象,拷贝等,可以提高效率。

不是必须的,你引用的文字说的很清楚,那样开销比较大而已。