关于复制构造函数 构造函数一类的问题
#include<iostream>
using namespace std;
class stu{
private:
int x;
int y;
public:
stu(int a=1,int b=1)
{
x=a;
y=b;
cout<<"调用构造函数\n";
}
stu(const stu &d)
{
x=d.x+2;
y=d.y+2;
cout<<"调用拷贝构造函数\n";
}
stu & operator=(const stu &d)
{
x=d.x+10;
y=d.y+10;
cout<<"调用赋值函数\n";
return *this;
}
print()
{
cout<<x<<','<<y<<endl;
}
// ~stu()
// {
// cout<<"调用析构函数\n";
// }
};
int main()
{
stu a;
stu b=stu(a);//两次调用复制构造函数
a.print();
b.print();
stu c,d;
d=c=a;//等价于 d.operator=(c.operator=(a));
c.print();
d.print();
stu f;
f=stu(a);
f.print();
stu g=a;//调用的复制构造函数;
g.print();
return 0;
}
这个是我自己为了学习编写的
出现的问题就是如果加入析构函数那一块(就是我注释掉的)和不加结果不一样,特别是stu b=stu(a);
小弟新手,网高手不吝赐教。谢谢。
[解决办法]
不知道楼主所说的结果不一样是啥意思,其实前后结果唯一不一样的就是注释前能输出所有的析构信息,就是打印出“调用析构函数”,而注释后打印不出这句话,因为调用了默认析构函数吧,其他的地方都是一样的,另外你那个print没有返回值,会报错,在VS2008上编译是这样的!
[解决办法]
有啥不一样,在gcc里试了一下,没发现有啥不一样
stu b=stu(a),这个叫初始化,调用拷贝构造函数,其实和stu b=a是一样的效果,不会两次调用
再看
stu f;
f=stu(a);
这个地方,f已经初始化,调用的是默认的构造函数,这时f=stu(a),先会调用copy constructor创建一个匿名的对象,再调用=运算符做赋值运算,匿名对象已经用完,所以随后调用析构函数,f的值就是(13,13)
[解决办法]
这个应该是编译器的关系,不同编译器对语句实现方式不同吧。我用VStudio2012运行了一下,发现跟C++ Primer Plus上讲的也不一样
[解决办法]
建议用vs系列的吧,自我感觉vc6.0并不成熟。
关于复制构造函数 构造函数一类的有关问题
关于复制构造函数 构造函数一类的问题#includeiostreamusing namespace stdclass stu{private:int xin
