0

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

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

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;
    //?
}
4

2 回答 2

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;
}
于 2013-09-29T12:37:42.310 回答
1

复制构造函数对原始内存进行操作。因此,如果它引用了一个尚未设置的成员变量,那么它就是在引用未初始化的内存。

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

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

于 2013-09-29T12:36:32.753 回答