我正在学习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
它现在表现正常(第一个输出是正常行为)。以后我可能会了解有关赋值运算符的更多信息。
答案 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 ++确实如此。
所以第一个输出是正常的,而我的“预期输出”是错误的行为。