【发布时间】:2021-04-01 11:07:47
【问题描述】:
我正在测试以下代码,令我困惑的是析构函数调用比构造函数调用多:
#include <iostream>
struct A {
A() { std::cout << 1; }
A(int) { std::cout << 7; }
~A() { std::cout << 5; }
};
struct B {
B() { std::cout << 2; }
B(int) { std::cout << 9; }
~B() {std::cout << 3;}
};
struct C {
B b;
A a1;
A a2;
C() : a1(3){
b = 3;
a2 = 7;
}
};
int main(){
C c;
return 0;
}
输出如下:
B() A(int) A() B(int) ~B() A(int) ~A() ~A() ~A() ~B()
2 7 1 9 3 7 5 5 5 3
我的猜测是,在 b = 3 和 a2 = 7 行中,3 和 7 必须隐式转换为 B 和 A,当它们被复制到 b 和 a2 时,它们会被销毁。
这是正确的还是这里发生了其他事情?
【问题讨论】:
-
在您提供的输出中,我看到对构造函数和析构函数的调用次数相同:3 对
A和 2 的调用对呼叫对B。我错过了什么? -
出于某种原因,我认为 A(int) 构造函数是复制构造函数,而不是基本构造函数。我现在想通了..
-
如果你输出
this的值而不是那些数字,你会得到更好的结果。您会很快看到一些被销毁的对象没有被您的代码正确跟踪。 -
现在我已经阅读了所有这些答案,我觉得问这个问题有点愚蠢,因为我现在很清楚这里发生了什么。我出于某种原因认为 A(int) 正在将整数值复制到 b/a2 中,它实际上是在构造一个临时对象,然后将副本分配到 b/a2 中。感谢您的帮助!
标签: c++ constructor destructor