使用初始化列表时的 C++ 数据成员初始化顺序

c++ data members initialization order when using initialization list

本文关键字:初始化 C++ 数据成员 顺序 列表      更新时间:2023-10-16
class A
{
private:
int a; 
int b; 
int c;
public:
A() : b(2), a(1), c (3)
{
}
};

根据C++标准数据成员是按照声明顺序构造和初始化的,对吗?

但是当使用初始列表时,我们正在更改数据成员的顺序,现在它们是按照初始化列表的顺序还是声明的顺序进行初始化?

在声明的顺序中,初始化列表中的顺序无关紧要。一些编译器实际上会给你警告(gcc(,告诉你初始化列表顺序与声明顺序不同。这就是为什么在使用成员初始化其他成员等时还必须小心的原因。

不,初始化列表与它无关。

成员始终按照它们在类主体中的显示顺序进行初始化。

一些编译器甚至会警告您顺序是否不同。

它们按声明顺序初始化。此外,许多编译器警告您,尽管标准允许,但初始化列表与声明顺序不匹配。

在 C++11 中,您还可以执行以下操作:

class A
{
    private:
    int a = 1; 
    int b = 2; 
    int c = 3; 
public:
    A()
    {
       // your code
    }
};

数据成员始终按其在类中的声明的>上下顺序初始化,并以相反的顺序销毁。初始化列表不会影响数据成员的初始化顺序。

您也可以查看下面的相关问题,了解使用初始化列表时更棘手的情况,

函数

调用如何处理构造函数初始器列表中的单元化数据成员对象