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

Is object guaranteed to be initialized before calling its member function?

本文关键字:函数 初始化 成员 是否 调用 对象      更新时间:2023-10-16

从这个问题(仍未解决(我遇到了这个新问题,所以在这里我举了一个例子:

//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; }
};

在 g++ 6.3.0 中,输出为:(g++ -o test file1.cpp file2.cpp prac.cpp -std=c++11(
一个科特尔
使用 B
B 克托尔

所以从代码示例中似乎没有这样的保证,并且可能是未定义的行为?标准有没有说这个?(我不认为这是重复的,因为这种情况有点不同:在a的初始化中,调用b的成员函数。

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

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