参数的初始化 from <>

wgsspank 2005-08-26 09:49:57
在 <<Inside The C++ Object Model>>书上 p62页,是关于参数初始化 调用copy constructor 的描述:
void foo(X x0);
下面这样的调用方式:
X xx;
foo(xx);
在编译器实现技术上,有一种策略是导入所谓的暂时性Object,并调用copy constructor 将其初始化,然后将暂时性的object 交给函数。列如前一段程序代码转换如下:

//C++的伪码:
//编译器产生出来的暂时对象
X __temp0;
// 编译器对 copy constructor 的调用
__temp0.X::X(xx);
//重新改写函数调用操作,以便使用上述的暂时对象
foo(__temp0);

这部分能容易理解
但是后面书上的叙述就有些不清楚了:

因为foo的声明 __temp0 临时对象作为参数要bitwise拷贝到x0这个局部实体中,“噢,真讨厌,foo()的声明因而也必须被转化,形式参数必须从原来的一个class X object 改变为一个 class X reference ,象这样:”
void foo (X& x0);

======================================================
我的问题是,参数修改成X& x0 后,上面的临时对象是不是还要生成出来,如果是,那么传入的是临时的对象,比如说这个临时对象是xx对象copy出来的,那末函数中对临时对象的修改,在这个临时对象析构后也就没有意义,但是实际中我们用 foo(xx)是可以修改xx对象的(参数不是const&),前后有些矛盾了;如果说改为void foo(X& x0)不产生临时对象,这样可以解释过去!
望高手指教!
...全文
105 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
wgsspank 2005-08-29
  • 打赏
  • 举报
回复
谢谢各位的帮助!
kobefly 2005-08-26
  • 打赏
  • 举报
回复
我的问题是,参数修改成X& x0 后,上面的临时对象是不是还要生成出来
不是。
但是实际中我们用 foo(xx)是可以修改xx对象的(参数不是const&),

你理解有错误
int x;
foo(x);
你认为foo会修改x吗?
不可能的,修改的只是那个临时变量的值
你可以在foo函数之后打印x的值,确认一下
zhouhuahai 2005-08-26
  • 打赏
  • 举报
回复
参数改成了引用的话就不会再调用其复制构造函数了.也就是说不会生成临时对象.

楼主应该要注意引用传递和值传递的区别所在.
junguo 2005-08-26
  • 打赏
  • 举报
回复
void foo(X x0)产生的临时对象是X的一个对象,所以它需要整个X对象所需要的空间!
而void foo(X &x0)产生的临时对象一个引用(也就是说固定大小为4字节),而这个引用指向了传过来的对象本身,这样就可以通过该引用来改变对象本身了!
ttuurr 2005-08-26
  • 打赏
  • 举报
回复
mark

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧