奇怪的Constructor,CopyConstructor&Destructor
class Complex //Definitiong of class complex { public: Complex(double r=0,double i=0) { cout<<"Constructor"<<endl; mRel = r; mImag = i;} //constructor Complex(Complex& c) { mRel = c.mRel; mImag = c.mImag; cout<<"Copy constructor"<<endl; } friend Complex operator +(Complex c1,Complex c2); friend Complex operator -(Complex c1,Complex c2); void Display(); //Output complex //~Complex(){ cout <<"Destructor"<<endl;} //********************** private: double mRel,mImag; }; void Complex::Display() { cout<<"("<<mRel<<" "<<mImag<<")"<<endl; } Complex operator +(Complex c1,Complex c2) { return Complex(c1.mRel + c2.mRel,c1.mImag + c2.mImag); } Complex operator -(Complex c1,Complex c2) { return Complex(c1.mRel - c2.mRel, c1.mImag - c2.mImag); } void main() { Complex c1(5,4),c2(2,10),c3; cout<<"c1="; c1.Display(); cout<<"c2="; c2.Display(); c3 = c1 - c2; cout<<"c3=c1-c2="; c3.Display(); c3 = c1 + c2; cout<<"c3=c1+c2="; c3.Display(); }
问题在附件里,请大家看看,很奇怪的!!!(附件说明:结果一是就这样运行的结果,结果二是把程序中有星号的注释行里,被注释掉的析构函数开,即加了个析构函数!)
注:转载文章需注明来源:VCer.net 文章地址:http://vcer.net/2253.html
如果你觉得VCer.net不错,而且你愿意为VCer.net捐赠一元钱,那么点击后面的捐赠按钮吧:)
从语义上考虑,operator+与 operator-中均需调用copy constructor以构造参数c1、c2,函数中会construct一个temp object存放运算结果,函数退栈时将此temp object的值copy construct储存于函数的返回值(return value)中,再由函数的返回值赋值给c3。
这就是结果一有“copy constructor”的原因。
对于返回值对象的函数,c++允许编译器执行RVO优化。对于operator+与 operator-执行RVO优化,则函数会在return value上直接construct运算结果,优化掉了函数中temp object。
加上destructor,complier 认为有了优化的必要,从而结果2无“copy constructor”。
ccmz 于 2004-06-03 10:48:47.0 编辑 [回复该贴]
同问!!
拷贝函数在三种情况下调用
1:用一个对象初始化另一个对象;
2:对象作为参数传递给一个函数;
3:当一个函数返回一个对象的时候;
为什么没有析构函数时返回的时候能够调用显示的拷贝构造函数
难道有析构函数的时候没有调用显示的拷贝构造函数?
这时是调用隐式的拷贝构造函数吗?
所以楼主的现象颇令人疑惑.望知情者告知.欢迎讨论了,谢谢!
vcnovice 于 2004-06-01 20:59:33.0 编辑 [回复该贴]