在 C++ 中对 类 使用 '=' 而无需定义 '=' 运算符

Using '=' for Classes without Defining '=' Operator in C++

下面的赋值有效吗?

class A {
    int a;
public:
    A(int k): a(k){}
}
void main() {
    A first (5);
    A second;
    second = first;
}

如果有效,第二个会怎样? C ++是否进行深拷贝?还是浅拷贝?

由于您编写了一种形式的构造函数,编译器将不会提供默认构造函数,因此您的声明 'A second;' 将无法编译。你可以做 A second(0);然后第二=第一;

也许您是 C++ 的新手,也许是学生?

你很幸运,因为你的 A class 的数据成员是一个整数。这是一种普通的旧数据类型。简称POD。顺便说一句:您用复制构造函数标记了您的问题,但在您的示例中演示了一个赋值运算符。

它们是两个不同的东西。

复制构造函数基于另一个实例创建一个新实例。像这样:

class A
{
public:
   A(A& other) { ... }
};

赋值运算符如下所示:

class A
{
public:
    const A& operator=(const A& other) { ... }
};

由于您没有提供自己的赋值运算符,编译器为您提供了一个。事实上,编译器也会为你创建一个析构函数。这不是很好吗?好吧,不要总是相信你的编译器。如果您的 classes 除了普通旧数据之外还有任何东西,那么请养成提供您自己的构造函数、析构函数和赋值运算符的习惯。这是我遵守的规则。我不希望有一个 bug 需要 2 天的时间才能追踪到...由于我忘记在析构函数中释放内存而导致的内存泄漏。

对于你的情况,编译器为你做了一个浅拷贝。编译器永远不会为您制作深拷贝。你必须自己做。