我非常想知道的是为什么在“ 1”和“ 2”之间只有一个构造函数,为什么在“ 3”和“ 4”之间只有赋值和构造函数。
#include <iostream>
#include <string>
using namespace std;
class A{
public:
A(){
cout << "Empty-constructor" << endl;
}
A(const A &a){
cout << "Copy-constructor" << endl;
this->v = a.v;
}
A operator=(const A &a){
cout << "Assignment" << endl;
this->v = a.v;
return *this;
}
int get(){
return v;
}
void set(int v){
this->v = v;
}
private:
int v;
};
A func(){
A a;
return a;
}
int main(){
cout << "1" << endl;
A b = func();
cout << "2" << endl;
A c;
cout << "3" << endl;
c = b;
cout << "4" << endl;
return 0;
}
答案 0 :(得分:4)
A b = func();
仅由于copy elision/NRVO而产生构造;新的A
被直接构造到调用者的内存中。
b = c;
涉及赋值和构造,因为您不正确地编写了赋值运算符,使它按值返回,而不是按引用返回,因此执行赋值后,它会从您刚刚创建的对象中复制构造分配给它,并返回副本(该副本未被使用,并立即被丢弃)。这是一个巨大的浪费,应该真正解决该问题,以使赋值运算符按引用返回,并进行以下更改:
A operator=(const A &a){
收件人:
A& operator=(const A &a){
更好的是,使用the copy-and-swap idiom来避免重复代码,以便在各处进行复制/交换。