为什么我的C ++对象没有用给定的值销毁?

时间:2018-11-04 12:16:10

标签: c++

我正在学习C ++。我遇到了一个令人困惑的问题,希望你们能帮助我。这是我的源代码:

#include <iostream>
using namespace std;

class A
{
public:
    int t;
    A(int _t) : t(_t) {
        cout << "> created: " << t << endl;
    }
    A(const A& a) {
        cout << "> copied: " << a.t << endl;
    }
    ~A() {
        cout << "> destroyed: " << t << endl;
    }
};

int main()
{
    A a(50);
    a = A(100);
    return 0;
}

以下是输出:

> created: 50
> created: 100
> destroyed: 100
> destroyed: 100

但是,我的预期输出是:

> created: 50
> created: 100
> destroyed: 50
> destroyed: 100

您能解释一下为什么50没有被销毁以及100为什么被销毁了两次吗?

谢谢。

更新

我添加以下代码:

A& operator=(A const& a) {                                                                                                          
    cout << "> assigned: t=" << t << " a.t=" << a.t << endl;                                                                        
    return *this;                                                                                                                   
}    

然后输出变为:

> created: 50
> created: 100
> assigned: t=50 a.t=100
> destroyed: 100
> destroyed: 50

它现在表现正常(第一个输出是正常行为)。以后我可能会了解有关赋值运算符的更多信息。

3 个答案:

答案 0 :(得分:3)

a = A(100);使用implicitly-defined copy assignment operator,它将成员t的值从临时值复制到a

如果您希望看到它的实际效果,请自己定义(按照Eljay's comment):

A& operator=(A const& a) {
    cout << "> copy-assigned: " << t << endl; return *this;
}

请注意,此定义和您对复制构造函数的定义都被“破坏了”,因为它们不进行任何复制。

答案 1 :(得分:0)

应用程序输出正确。 因为当您声明该对象A时,a(50)“ a”的值为50(a.t = 50)。 然后,您只需更改“ a.t = 100”的值 A(100)是一个临时值,然后分配给“ a.t”。

所以当析构函数工作时,只有a.t = 100。

答案 2 :(得分:0)

我可能将C ++与Java混合使用。

在Java中,=运算符不会更改左值的成员。但是C ++确实如此。

所以第一个输出是正常的,而我的“预期输出”是错误的行为。