c++用临时对象来初始化一个新创建的对象,会调用复制构造函数还是重载operator=()函数
#include <iostream>using namespace std;
class A
{
public:
A(int x):i(x)
{
cout << "构造A.\n";
}
A(const A&x)
{
i=x.i;
cout << "复制构造A.\n";
}
~A()
{
cout << "析构A.\n";
}
void print()const
{
cout << i << endl;
}
A operator++()
{
++i;
return(*this);
}
A&operator=(const A&x)
{
cout << "operator=.\n";
if(this==&x)
{
return(*this);
}
else
{
i=x.i;
return(*this);
}
}
private:
int i;
};
int main()
{
A a(999);
a.print();
A b=++a;
b.print();
}
A b=++a; ++a调用operaot++()函数返回的临时对象怎么赋给对象b???求解。
shy_boy 发表于 2013-10-25 21:19 static/image/common/back.gif
哦哦,*this初始化b调用什么函数?
“初始化”一个对象就一定是调用构造函数。用一个对象初始化另一个对象,就是调用一种叫做“拷贝构造函数”的构造函数 A b = ++a;等价于 A b=(a.operator++()),具体的执行顺序就是执行到这步的时候,先++a,也就是执行a.operator++() , 这时候a.i = 1000了,然后执行拷贝构造函数,用 a初始化b , 其实你的operator=()这个函数在这里没有用上的,不信你可以删了那段函数,再运行一遍 调试的结果只调用了一次复制构造函数.
A operator++()
{
++i;
return(*this);
}
这里按值返回会调用一次复制构造函数.
A b=++a;右边返回的*this赋给左边的对象b,不用调用复制构造函数吗? 这是编译器的优化处理,因为编译器看出A b=++a;可以直接用*this对象来(拷贝)构造b,从而省去一个临时对象,所以编译器就这样做了,于是就没有临时对象了。
此外,为什么你的A operator++()不写为A& operator++()呢?还有,为什么有前置++却没有后置++呢? 仰望天上的光 发表于 2013-10-25 18:08 static/image/common/back.gif
这是编译器的优化处理,因为编译器看出A b=++a;可以直接用*this对象来(拷贝)构造b,从而省去一个临时对象 ...
是不是编译器把b作为*this的名字,作为它的标签一样?? shy_boy 发表于 2013-10-25 20:07 static/image/common/back.gif
是不是编译器把b作为*this的名字,作为它的标签一样??
不是。如果编译器完全不优化,应该是用*this来初始化一个无名的零食对象,接着用无名临时对象来初始化b。优化后,直接用*this来初始化b 仰望天上的光 发表于 2013-10-25 21:02 static/image/common/back.gif
不是。如果编译器完全不优化,应该是用*this来初始化一个无名的零食对象,接着用无名临时对象来初始化b。 ...
哦哦,*this初始化b调用什么函数?
页:
[1]