使用' ='没有定义的课程' =' C ++中的运算符

时间:2015-02-14 04:52:23

标签: c++ class copy-constructor

以下作业是否有效?

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

如果有效,第二次会发生什么? C ++是否会制作深层副本?还是一个浅薄的副本?

2 个答案:

答案 0 :(得分:3)

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

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

他们是两回事。

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

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

赋值运算符如下所示:

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

由于您没有提供自己的赋值运算符,因此编译器为您创建了一个赋值运算符。实际上编译器也会为你做一个析构函数。不是很好吗?好吧,不要总是信任你的编译器。如果你的课程有超出普通旧数据的东西,那么请养成提供自己的构造函数,析构函数,赋值运算符的习惯。这是我的生活规则。我讨厌有一个错误需要2天才能跟踪说...由于忘记在析构函数中释放内存而导致内存泄漏。

在您的情况下,编译器为您制作了浅表副本。编译器永远不会为您制作深层副本。你必须自己做。

答案 1 :(得分:1)

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