关于C ++中的构造函数和赋值运算符

时间:2018-11-24 05:20:08

标签: c++

我正在学习cpp,现在有问题。这是代码和结果。

我非常想知道的是为什么在“ 1”和“ 2”之间只有一个构造函数,为什么在“ 3”和“ 4”之间只有赋值和构造函数。

提前谢谢

the result

#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;
}

1 个答案:

答案 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来避免重复代码,以便在各处进行复制/交换。