sfxyz7 2015-04-19 06:24 采纳率: 0%
浏览 1845

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()的声明必须转化为引用?

  • 写回答

3条回答 默认 最新

  • cgwfeel 2015-04-19 07:15
    关注

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

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

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

    评论

报告相同问题?

悬赏问题

  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误
  • ¥15 一道python难题3
  • ¥15 用matlab 设计一个不动点迭代法求解非线性方程组的代码
  • ¥15 牛顿斯科特系数表表示
  • ¥15 arduino 步进电机
  • ¥20 程序进入HardFault_Handler
  • ¥15 oracle集群安装出bug
  • ¥15 关于#python#的问题:自动化测试