我写了这个简单的代码,我期待不同的结果。
struct Test {
int value_;
Test(): value_(0) {
std::cout << "Constructor: "<< value_ << "\n";
}
Test(int value): value_(value) {
std::cout << "Constructor: "<< value_ << "\n";
}
~Test() {
std::cout << "Destructor: "<< value_ << "\n";
}
};
int main(int argc, char **argv) {
Test t;
t = Test(10);
t = Test(15);
t = Test(20);
t = Test(25);
}
结果:
Constructor: 0
Constructor: 10
Destructor: 10
Constructor: 15
Destructor: 15
Constructor: 20
Destructor: 20
Constructor: 25
Destructor: 25
Destructor: 25
我很惊讶,因为它没想到最后一行会重复。为什么没有调用Destructor: 0
?
答案 0 :(得分:5)
第一个&#34;析构函数:25&#34;来自Test(25)
创建的临时对象的破坏;第二个是来自被复制的t
的破坏。
除了最后一个&#34;析构函数:&#34; line和第一个&#34;构造函数:&#34;,所有输出都来自这些临时对象的创建和销毁。没有&#34;析构函数:0&#34;因为你永远不会创建一个值为0的临时对象,并且当t
被销毁时,它的值不再是0。
答案 1 :(得分:1)
这些行中的第一行对应于临时对象的销毁。
这些行中的第二行对应于t
的破坏。
自t
被破坏后,value_
为25
,因为您使用了
t = Test(25);
是main
中的最后一行。