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 运筹学排序问题中的在线排序
  • ¥30 求一段fortran代码用IVF编译运行的结果
  • ¥15 深度学习根据CNN网络模型,搭建BP模型并训练MNIST数据集
  • ¥15 lammps拉伸应力应变曲线分析
  • ¥15 C++ 头文件/宏冲突问题解决
  • ¥15 用comsol模拟大气湍流通过底部加热(温度不同)的腔体
  • ¥50 安卓adb backup备份子用户应用数据失败
  • ¥20 有人能用聚类分析帮我分析一下文本内容嘛
  • ¥15 请问Lammps做复合材料拉伸模拟,应力应变曲线问题
  • ¥30 python代码,帮调试,帮帮忙吧