对象是否保证在调用其成员函数之前被初始化
Is object guaranteed to be initialized before calling its member function?
从这个问题(仍未解决(我遇到了这个新问题,所以在这里我举了一个例子:
//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
、尚未创建的对象或已销毁的对象。这种情况的解决方案之一是在函数中使用静态本地对象而不是全局对象,并返回对它的引用/指针。这种方法在销毁顺序方面仍然存在问题,但至少有一半的问题已经消失。
相关文章:
- 有没有一种代码密度较低的方法来使用非默认构造函数初始化数组?
- 如何在 C++ 中使用它的构造函数初始化 unique_ptrs 的 2D 向量?
- 我们是否需要为 C++ 中的多个函数初始化多个模板?
- 在C++中使用默认构造函数初始化对象的不同方法
- 使用默认构造函数初始化对象的不同方法
- 我们可以用参数化构造函数初始化结构的数组吗?
- 有没有办法使用该类的构造函数初始化另一个类的私有部分内的对象数组?
- 类内初始化与构造函数初始化列表的顺序
- 通过 C++ 中的重载构造函数初始化未知类型的变量
- 使用复制构造函数初始化 new[]
- 如何从子类的构造函数初始化父类的私有成员
- 在构造函数初始化列表中使用 std::variant
- 使用构造函数初始化结构还是在之后设置其值更好?
- C++ 没有匹配的构造函数初始化 []
- 我正在使用dev c ++,但收到错误(C++98'array'必须由构造函数初始化)
- 如何从静态类函数初始化静态类对象
- 使用所述填充构造函数初始化向量中的向量
- 如何同时创建一个具有两个或多个构造函数初始化的对象
- 使用 c++ 中的函数初始化数组
- 使用 lambda 函数初始化静态数据成员