关于C++无参构造函数调用有参构造函数的疑问!!!!!

CharisZhang18 2012-08-15 04:47:39
#include <iostream.h>

class A
{
public:
A()
{
A(0);
}
A(int i)
{
m_data = i;
}

void Print()
{
cout<<m_data<<endl;
}
protected:
private:
int m_data;
};

int main()
{
//A a(0);
A a;
a.Print();
}


为什么打印出来不是0呢? 我调试的时候代码走到初始化的地方了????小白求教!
...全文
724 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
net_assassin 2013-08-05
  • 打赏
  • 举报
回复
A(0)生成临时对象,根本不是同一个对象!
taotao945 2013-08-04
  • 打赏
  • 举报
回复
因为在默认构造函数中调用一个内部的带参数的构造函数是用户的行为,不是编译器的行为,就像是调用普通的 函数一样,它不会执行构造函数的初始化部分,因此输出结果不会是0。
zhaoZero41 2012-08-15
  • 打赏
  • 举报
回复
这个操作由于调用了两次构造函数,所以生成了两个对象。进行赋值的是隐藏的对象成员,而不是你声明的成员,隐藏的成员在构造完毕之后就被析构了。

尽量不要用构造套用构造的形式,如果一定要用,需要用到Placement New。代码如下:
A()
{
new (this)A(0);
}


这条语句的功能是:当你调用声明对象的构造函数时,不会因为调用两次构造而分配新的内存生成新对象,它会在原来内存的基础上进行操作。
小二人 2012-08-15
  • 打赏
  • 举报
回复
调用构造函数是会生成对象的,调用有参构造函数其实是生成了另外一个A类的临时对象,并不会改变调用对象的成员值。
iamzep 2012-08-15
  • 打赏
  • 举报
回复
楼主你的构造函数也调用啊,不调用怎么实现赋值的功能啊
iamzep 2012-08-15
  • 打赏
  • 举报
回复
楼主类里面的A()函数都没有调用,所以根本没有你所谓的把0赋给m_data。。。。
种菜的 2012-08-15
  • 打赏
  • 举报
回复
#include <iostream>
using namespace std;

class A
{
private:
int m_data;
public:
A() { A a = A(100); m_data = a.m_data; }
A(int i) { m_data = i; }
void Print() { cout << "m_data:" << m_data << endl; }
};

int main()
{
A a;
cout << "size1:" << sizeof(a) << endl;
a.Print();
return 0;
}
你生成了两个对象,那个赋值是为另一个新对象赋的值,并没有为自己的成员赋值;
看看我改的构造函数赋值100,然后从新对象获取值,结果就是100了。
种菜的 2012-08-15
  • 打赏
  • 举报
回复
我认为你这样使用构造函数是生成了两个对象啊,打印的不是你想要的对象。

64,281

社区成员

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

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