是否保证在调用其成员函数之前初始化对象?

时间:2018-04-13 12:50:49

标签: c++ language-lawyer

来自this question(仍未解决)我遇到了这个新问题,所以我在这里做了一个例子:

Label

在g ++ 6.3.0中输出为:( g ++ -o test file1.cpp file2.cpp prac.cpp -std = c ++ 11)
一个cotr
使用b
b ctor

所以从代码示例来看似乎没有这样的保证,可能是未定义的行为?标准是否有任何关于此的说法?(我不认为这是重复的,因为这种情况有点不同:在//main.cpp int main() { return 0; } //file1.cpp #include "b.h" B b; //file2.cpp #include "a.h" A a; //a.h #pragma once #include<iostream> #include "b.h" extern B b; class A { public: A(){ std::cout << "a cotr" << std::endl;b.Use(); } }; //b.h #pragma once #include<iostream> class B { public: B() { std::cout << "b ctor"<<std::endl; }; void Use() { std::cout << "use b" << std::endl; } }; 的初始化中,调用a的成员函数。)

1 个答案:

答案 0 :(得分:1)

  

是否保证在调用其成员函数之前初始化对象?

不,你的工作是不要在无效对象上调用任何非静态成员函数,包括但不限于将Class c = int.class 作为nullptr传递,尚未创建的对象或已经被销毁的对象。这种情况的解决方案之一是在函数中使用静态本地对象而不是全局对象,并返回对它的引用/指针。该方法仍然存在破坏顺序问题,但至少有一半问题消失了。