鉴于此代码:(简单的C++概念)构造的意外输出/析构函数调用
#include <iostream>
using namespace std;
class Foo {
public:
Foo() { c = 'a'; cout << "Foo()" << endl; }
Foo (char ch) { c = ch; cout << "Foo(char)" << endl; }
~Foo() { cout << "~Foo()" << endl; }
private:
char c;
};
class Bar : public Foo {
public:
Bar() { cout << "Bar()" << endl; }
Bar (char ch) : Foo(ch) { cout << "Bar(char)" << endl; }
~Bar() { cout << "~Bar()" << endl; }
};
Foo f1; static Bar b1;
int main()
{
Bar b2;
{
static Foo f2('c');
Foo f3;
Bar b3 ('d');
}
return 0;
}
(您只需直接粘贴到编译器这一点)
的第一部分我预期的示例输出是正确的:
Foo()
Foo()
Bar()
Foo()
Bar()
Foo(char)
Foo()
Foo(char)
Bar(char)
~Bar()
~Foo
~Foo()
~Bar()
~Foo()
~Foo()
但我得到两个静态的析构函数输出对象static Bar b1;
和static Foo f2('c');
错误。
最后部分正确的答案是:
~Bar()
~Foo()
~Foo()
我得到:
~Foo()
~Bar()
~Foo()
这是我的推理:
据我所知,所有本地对象静态对象之前销毁。其余两个静态对象static Bar b1;
和static Foo f2('c');
,static Foo f2('c');
出现最后,所以它被破坏第一个,因为析构函数按照它们创建的相反顺序被调用。
但是static Foo f2('c');
不是先破坏,static Bar b1;
是。为什么?
您应该添加一个成员变量来区分不同的对象。 – fefe
仅供参考:当使用g ++时,我得到了你期望得到的结果4.6.1 –
C++与Eclipse(MinGW)和Microsoft Visual Studio(禁用语言扩展)仍然输出“正确”的答案,而不是我的预期输出。 – Jason