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

C++ 没有指针数据成员的类-复制构造函数==赋值运算符?,c++,copy-constructor,deep-copy,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

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

我想我需要一些代码来解释我的意思:

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

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

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

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

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

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

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

否,涉及成员的赋值运算符:

#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;
}
#包括
#包括
结构X{

X(){std::cout否,涉及成员的赋值运算符:

#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;
}
#包括
#包括
结构X{

X(){std::难道你说的是编译器生成的复制构造函数/赋值运算符吗?当类包含指针时,你有这个问题的答案吗?在这种情况下,复制构造函数是否总是与赋值运算符相同?没有,因为复制构造和赋值不是同一回事。赋值是用一个我已以某种形式构造。作为复制构造目标的对象尚未构造(这是构造函数的起点)。和指针,它们与此无关。复制构造和赋值不一样。按照您所示的方式实现,编译器没有生成该复制构造函数;您生成了。
a
b
是在进入复制构造函数体之前默认构造的,在复制构造函数体中,它们的赋值运算符将触发。如果y我们的示例精确到编译器为默认复制构造函数生成的内容,它们将位于初始值设定项列表中;未在构造函数体中赋值。但是,赋值运算符是一个精确的模型。赋值运算符中的注释应该是-因为没有任何数据成员是指针或类型类对象,并且类h因为没有基类。这种类型的类的常用术语是POD-Plain Old Data。你说的是编译器生成的复制构造函数/赋值运算符吗?当类包含指针时,你有这个问题的答案吗?在这种情况下,复制构造函数是否总是与赋值运算符相同?没有,因为复制构造和赋值不是一回事。赋值是用已经以某种形式构造的lhs完成的。作为复制构造目标的对象尚未构造(这是构造函数的起点)。和指针,它们与此无关。复制构造和赋值不一样。按照您所示的方式实现,编译器没有生成该复制构造函数;您生成了。
a
b
是在进入复制构造函数体之前默认构造的,在复制构造函数体中,它们的赋值运算符将触发。如果y我们的示例精确到编译器为默认复制构造函数生成的内容,它们将位于初始值设定项列表中;未在构造函数体中赋值。但是,赋值运算符是一个精确的模型。赋值运算符中的注释应该是-因为没有任何数据成员是指针或类型类对象,并且类h作为无基类。此类的常用术语是POD-普通旧数据。+1这符合标准。默认赋值运算符对每个成员变量执行成员对成员的赋值操作,其中lhs已构造。默认复制运算符执行成员对成员的复制构造,其中每个中的hs即将建造(即尚未建造)。所有道路最终都会导致复制构造和赋值之间的基本差异。构造函数只会这样做:构造。赋值有一个已构造的lhs。很好的示例,顺便说一句+1这符合标准。默认赋值运算符对每个成员变量执行成员对成员的赋值操作,lhs为默认的复制ctor执行成员对成员的复制构造,其中每个复制ctor中的lhs将要构造(即尚未构造).所有的道路最终都会导致复制施工和分配之间的基本差异。施工人员只是这样做:施工。分配有一个已经施工的lhs。顺便说一句,很好的示例。