4
class A
{
private:
int a; 
int b; 
int c;

public:
A() : b(2), a(1), c (3)
{
}
};

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

但是在使用初始化列表的时候,我们改变了数据成员的顺序,现在是按照初始化列表的顺序初始化还是按照声明的顺序初始化呢?

4

5 回答 5

7

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

于 2012-08-25T22:42:38.660 回答
1

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

成员总是按照它们在类主体中出现的顺序进行初始化。

如果命令不同,一些编译器甚至会警告您。

于 2012-08-25T22:43:02.073 回答
1

它们按声明顺序初始化。许多编译器也警告您,您的初始化列表与声明顺序不匹配,尽管标准允许这样做。

于 2012-08-25T22:43:30.423 回答
1

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

class A
{
    private:
    int a = 1; 
    int b = 2; 
    int c = 3; 

public:
    A()
    {
       // your code
    }
};
于 2012-08-25T23:17:23.963 回答
0

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

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

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

于 2015-12-01T03:56:58.800 回答