构造函数

挣扎中前行 2013-07-01 09:33:33

struct CLS
{
int m_i;
CLS( int I ) : m_i(i) {}
CLS()
{
CLS(0);
}
};
CLS obj;
cout << obj.m_i << endl;


这段代码会输出0吗?谁给解释下?
...全文
229 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
allenltiverson 2013-07-06
  • 打赏
  • 举报
回复
显式的调用构造函数本身就是一个不正确的思维。
lm_whales 2013-07-05
  • 打赏
  • 举报
回复
struct CLS
{
int m_i;
CLS( int I ) : m_i(i) {}
CLS()
{
CLS(0);//定义了一个从不使用的,无名临时变量,会被优化掉的。
}
};
CLS obj;
cout << obj.m_i << endl;
Oo纳兰筱DoO 2013-07-02
  • 打赏
  • 举报
回复
是一个垃圾值。 构造函数在对象创建后第一次被调用前运行,在对象的生存期内只能执行一次构造函数。 从程序的运行时结构来讲: 执行到CLS obj时在栈中压入4字节作为obj.m_i的使用空间,同时将 CLS()作为构造函数进行调用, 当调用到CLS(0)时不会将其作为构造函数进行调用而是作为对象进行创建,此刻继续在栈中压入4字节 作为CLS(0).m_i的使用空间,之后调用CLS(int i) : m_i(i){}进行初始化。
dongdongdongJL 2013-07-02
  • 打赏
  • 举报
回复
也就是说,构造函数的互调有问题。学习,记住每调用一次构造函数,就会创建一个新的对象。
翅膀又硬了 2013-07-01
  • 打赏
  • 举报
回复
1楼正解,CLS()里面的 CLS(0); 是在实例化另一个对象,不是你的CLS obj了。为了便于理解,你可以这样写那个构造

CLS() 
{
  CLS(0);
  m_i = 12;
}
挣扎中前行 2013-07-01
  • 打赏
  • 举报
回复
引用 1 楼 ganpengjin1 的回复:
不会,CLS(0); 在你实例化一个对象的时已被构造和初始化,你再到内部显示调用非本身实例化的构造函数,它是不属于已被实例化的对象的,所以输出应该是随机的垃圾值而已
什么是非本身实例化的构造函数啊?
mujiok2003 2013-07-01
  • 打赏
  • 举报
回复
随机值(包含0)
就是那个党伟 2013-07-01
  • 打赏
  • 举报
回复
目测楼上正解,可是调试下试试
漫步者、 2013-07-01
  • 打赏
  • 举报
回复
不会,CLS(0); 在你实例化一个对象的时已被构造和初始化,你再到内部显示调用非本身实例化的构造函数,它是不属于已被实例化的对象的,所以输出应该是随机的垃圾值而已
Frank_Liuxing 2013-07-01
  • 打赏
  • 举报
回复
对的。反正记住没调用一次构造函数,都会构造一个新的对象。
proad 2013-07-01
  • 打赏
  • 举报
回复
CLS(0);是新构造了一个无名临时对象,并不修改obj。 你可以在CLS(0);增加断点,观察this的值,再进入CLS(0)看this的值,两者是不一样的,不是同一实例。
lm_whales 2013-07-01
  • 打赏
  • 举报
回复
struct CLS { int m_i; struct CLS { int m_i; CLS( int I ) : m_i(i) {} CLS():CLS(0){} //C++11 允许构造函数互相调用,只是不知道有多少编译器实现了。 }; CLS obj; cout << obj.m_i << endl;
lm_whales 2013-07-01
  • 打赏
  • 举报
回复

struct CLS
{
int m_i;
CLS( int i ) : m_i(i) {}
CLS()struct CLS
{
int m_i;
CLS( int I ) : m_i(i) {}
CLS():CLS(0){} //C++11 允许构造函数互相调用,只是不知道有多少编译器实现了。
};
CLS obj;
cout << obj.m_i << endl;
PS : VC10 不支持构造函数互相调用。

65,187

社区成员

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

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