没有指针数据成员的类 - 复制构造函数==赋值运算符?

时间:2013-09-29 12:22:26

标签: c++ copy-constructor deep-copy

如果您的类没有使用指针声明的任何数据成员,那么复制构造函数是否始终包含与赋值运算符相同的代码?如果没有,为什么不呢?

编辑认为我需要一些代码来解释我的意思:

class A{
public:
    A();
    A(const A& a);
    A& operator=(const A& a);

private:
    int a;
    double b;
};

//Copy constructor
A::A(const A& src){
    a = src.a;
    b = src.b;
}

//Assignment operator
A& A::operator=(const A& src){
    //Because none of the data members are pointers- the code in here 
    //would be the same as the copy constructor?

    //Could I do:
    a = src.a;
    b = src.b;
    //?
}

2 个答案:

答案 0 :(得分:3)

不,成员的任务操作员参与:

#include <iostream>
#include <stdexcept>

struct X {
    X() { std::cout << "construct" << std::endl; }
    X(const X&) { std::cout << "copy construct" << std::endl;  }
    X& operator = (const X&) {
        throw std::logic_error("assignment");
    }
};

struct Y {
    X x;
};

int main() {
    Y y0;
    Y y1(y0);
    y1 = y0;
    return 0;
}

答案 1 :(得分:1)

复制构造函数在原始内存上运行。 因此,如果它引用了尚未设置的成员变量, 然后它引用了未初始化的内存。

赋值运算符对已包含构造对象的内存进行操作。 因此,所有成员变量都在赋值运算符开始之前初始化。

如果您的赋值运算符未检查任何成员变量, 然后复制ctor代码将是相同的。 但请注意,在赋值运算符中使用成员变量赋值运算符 可能会引用您不了解的数据。