用引用给变量赋值 不明白的?

butterflygogogo 2010-08-16 01:05:36
Class A{};
int main()
{
A a;
A& aRef = a;
A b = aRef;
}
上面的几行语句我理解的是 初始化一个A类的对象a,再初始化一个A类型的引用aRef, 然后用对象a给引用aRef赋值 ,此时,a和aRef表示的是一个对象。然后初始化一个A类的对象b,然后用引用aRef给对象b赋值 ,那么此时,a,b,aRef三者都是表示内存中的同一个对象吗?这整个赋值的过程中,构造函数是都是怎么执行的?
...全文
350 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
FengRider 2010-08-16
  • 打赏
  • 举报
回复
A a; //定义一个A的对象a,调用默认构造函数给a分配空间。
A& aRef = a; //定义一个a的引用aRef。aRef就是a,二者的内存空间完全一样。
A b = aRef; //定义一个A的对象b,并且用拷贝构造函数给b分配空间。
a和aRef是一回事,就好象西红柿甲与蕃茄甲的关系一样。b与a的关系,则是西红柿甲与西红柿乙的关系一样。二者有很多相似之处,但二者就是不同是一个东西。至于二者是如何相似,甚至某些个别相同的,具体要看你的拷贝构造函数是如何定义的了。
ShouWan2009 2010-08-16
  • 打赏
  • 举报
回复
a 和 aRef表示内存中的同一个对象!而b,“A b = aRef;”这段代码的本质是将aRef所指向的对象通过A的默认拷贝构造函数拷贝给b,所以虽然b中内容与a中内容一样,但是b和a已经不是同一对象,它们在内存中的地址不一致!
GARY 2010-08-16
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 thefirstz 的回复:]
可以写个程序测试下~~

C/C++ code
class A{
public:
A(){cout<<"A()"<<endl;}
A(const A&){cout<<"const A&"<<endl;}
};

int main(int argc, char* argv[])
{
A a1;
A &temp = a1;……
[/Quote]
不错。
zyq472735711 2010-08-16
  • 打赏
  • 举报
回复
a调用不带参数的构造函数,b调用的是默认拷贝构造函数,并不是赋值函数,因为b是初次创建。
butterflygogogo 2010-08-16
  • 打赏
  • 举报
回复
结贴给分。。。谢啦
昵称很不好取 2010-08-16
  • 打赏
  • 举报
回复
可以写个程序测试下~~
class A{
public:
A(){cout<<"A()"<<endl;}
A(const A&){cout<<"const A&"<<endl;}
};

int main(int argc, char* argv[])
{
A a1;
A &temp = a1;
A a2 = temp;
system("pause");
return 0;
}
adventurelw 2010-08-16
  • 打赏
  • 举报
回复
b确实不是
理论上来说b是先构造再赋值,但实际优化中可能会是直接的复制构造函数调用。
butterflygogogo 2010-08-16
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 luzhiwei512 的回复:]

a和aref是指同一个对象,b不是。b先构造然后通过默认赋值运算符进行赋值
[/Quote]
也就是说 b一份新构造的对象 ?
luzhiwei512 2010-08-16
  • 打赏
  • 举报
回复
a和aref是指同一个对象,b不是。b先构造然后通过默认赋值运算符进行赋值

64,652

社区成员

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

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