#include<iostream>
using namespace std;
classMyClass
{
public:
MyClass(inti = 0)
{
cout << i;
}
MyClass(constMyClass &x)
{
cout << 2;
}
MyClass &operator=(constMyClass &x)
{
cout << 3;
return*this;
}
~MyClass()
{
cout << 4;
}
};
intmain()
{
MyClass obj1(1), obj2(2);
MyClass obj3 = obj1;
return0;
}
运行时的输出结果是()
- 11214444
- 11314444
- 122444
- 123444
这道题注意MyClass obj3 = obj1和 MyClass obj3,obj3=obj1的区别。
第一个会调用拷贝构造函数
第二个会调用赋值函数
用一个对象初始化一个新的对象,调用拷贝构造函数
用一个对象为一个已有对象赋值,调用赋值运算符
本题属于前者
用一个对象为一个已有对象赋值,调用赋值运算符
本题属于前者
拷贝构造函数发生在对象还没有创建,需要创建时,如obj3;赋值操作符重载仅发生在对象已经执行过构造函数,即已经创建的情况下
前两个对象构造时分别输出1,2
第三个对象是这样构造的MyClass obj3 = obj1,之前没有执行过构造函数创建对象,所以这里会调用拷贝构造函数,输出2
然后三个对象依次析构,输出444
所以最终输出122444
第三个对象是这样构造的MyClass obj3 = obj1,之前没有执行过构造函数创建对象,所以这里会调用拷贝构造函数,输出2
然后三个对象依次析构,输出444
所以最终输出122444