输出值为什么没有变化? 高级C++问题(构造函数问题)

bgcelite 2010-05-06 02:38:39
struct SComponent
{
int m_i;
SComponent()
{
m_i = 0;
}
void Empty()
{
SComponent();
}
};

int main(int argc, char* argv[])
{

SComponent f;
f.m_i = 111;
f.Empty();
cout<<f.m_i<<endl;
return 0;
}
...全文
143 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
pengzhixi 2010-05-17
  • 打赏
  • 举报
回复
构造临时对象也是要调用构造函数的啊
bgcelite 2010-05-17
  • 打赏
  • 举报
回复
14: {
004011A0 55 push ebp
004011A1 8B EC mov ebp,esp
004011A3 83 EC 48 sub esp,48h
004011A6 53 push ebx
004011A7 56 push esi
004011A8 57 push edi
004011A9 51 push ecx
004011AA 8D 7D B8 lea edi,[ebp-48h]
004011AD B9 12 00 00 00 mov ecx,12h
004011B2 B8 CC CC CC CC mov eax,0CCCCCCCCh
004011B7 F3 AB rep stos dword ptr [edi]
004011B9 59 pop ecx
004011BA 89 4D FC mov dword ptr [ebp-4],ecx
15: SComponent();
004011BD 8D 4D F8 lea ecx,[ebp-8]
004011C0 E8 AB FF FF FF call SComponent::SComponent (00401170)16: }
004011C5 5F pop edi
004011C6 5E pop esi
004011C7 5B pop ebx
004011C8 83 C4 48 add esp,48h
004011CB 3B EC cmp ebp,esp
004011CD E8 0E 00 00 00 call __chkesp (004011e0)
004011D2 8B E5 mov esp,ebp
004011D4 5D pop ebp

这里的却是构造了一个匿名的临时对象而已。哪位能够解释一下为什么会构造一个匿名的临时对象而不是调用构造函数,谢谢(知其然还要知其所以然)
bgcelite 2010-05-17
  • 打赏
  • 举报
回复
多谢各位的解答
bgcelite 2010-05-17
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 pengzhixi 的回复:]
构造临时对象也是要调用构造函数的啊
[/Quote]

我想知道为什么会构造了一个匿名的临时对象,而不是调用构造函数
北辰猫咪 2010-05-17
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 pengzhixi 的回复:]

void Empty()
{
SComponent();//你这里是构造了一个匿名的临时对象而已。与对象f毫不相关
[/Quote]
正确
刀仔割大树 2010-05-06
  • 打赏
  • 举报
回复
如果lz硬要使用构造函数让类里面的值为0,可以调用构造函数生产一个对象并赋值给当前对象:
	void Empty()
{
*this = SComponent();
}
刀仔割大树 2010-05-06
  • 打赏
  • 举报
回复
3楼你错了,lz的类是struct声明的,struct声明的成员默认是public的。
ztenv 版主 2010-05-06
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 pengzhixi 的回复:]
void Empty()
{
SComponent();//你这里是构造了一个匿名的临时对象而已。与对象f毫不相关
[/Quote]
正解,
刀仔割大树 2010-05-06
  • 打赏
  • 举报
回复
在empty函数内调用构造函数,相当于构造一个新的对象,而不是对当前的对象赋值,lz请搞清楚这个概念。
在empty函数里面,调用SComponent();相当于生产一个新的对象,这个对象在empty函数结束后由系统自动释放掉。
如果改变成员变量值,可以在成员函数中修改其值。调用构造函数是不对的。
void Empty()
{
m_i = 0;
}
wesleyluo 2010-05-06
  • 打赏
  • 举报
回复
楼主,你哪个编译能通过吗?
怎么能够访问结构的私有成员变量?
请在int m_i;前面加上public:
应该可以了。
bEst_02 2010-05-06
  • 打赏
  • 举报
回复
调用Empty间接调用构造函数,结果是构造了一个新的对象,并没有影响原来对象的值
pengzhixi 2010-05-06
  • 打赏
  • 举报
回复
void Empty()
{
SComponent();//你这里是构造了一个匿名的临时对象而已。与对象f毫不相关

64,652

社区成员

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

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