在 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 天的时间才能追踪到...由于我忘记在析构函数中释放内存而导致的内存泄漏。
对于你的情况,编译器为你做了一个浅拷贝。编译器永远不会为您制作深拷贝。你必须自己做。
下面的赋值有效吗?
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 天的时间才能追踪到...由于我忘记在析构函数中释放内存而导致的内存泄漏。
对于你的情况,编译器为你做了一个浅拷贝。编译器永远不会为您制作深拷贝。你必须自己做。