C++类成员变量初始化顺序陷阱

 在构造函数里初始化的成员变量没什么好注意的,就是按照你写的初始化顺序来:

class ClassA
{
    public:
        ClassA(int a, int b)
        {
            a_ = a;
            b_ = b;
        }
    private:
        int a_;
        int b_;
}

这里肯定是a_先初始化,b_后初始化。

我们主要关注一下在定义时默认初始化或者用初始化列表初始化的成员变量:

class ClassA
{
    public:
        ClassA(int b) : b_(b)
        {
        }
    public:
        int a_ = b_ / 2; //a_初始化的时候b_还没初始化呢
        int b_;
}

ClassA obj(10);
std::cout << obj.b_ << std::endl; //输出10
std::cout << obj.a_ << std::endl; //不一定输出5

这里a_和b_按照定义的顺序来初始化,也就是a_初始化的时候b_还没初始化呢,a_不一定是5。

下面这种也是一样的,a_和b_是按照定义的顺序来初始化,即a_初始化的时候b_还没初始化呢。

class ClassA
{
    public:
        ClassA(int b) : a_(b_/2) b_(b)
        {
        }
    public:
        int a_ ;
        int b_;
}

ClassA obj(10);
std::cout << obj.b_ << std::endl; //输出10
std::cout << obj.a_ << std::endl; //不一定输出5

类成员变量通过初始化列表初始化时,与构造函数中的初始化列表中的变量顺序无关,只与定义成员变量的顺序有关。因为成员变量的初始化次序是根据变量在内存的次序有关系,而变量的内存排列顺序,早在编译期就根据变量的定义次序决定了。

所以不建议用初始化列表给某个成员变量初始化时用到其他成员变量,更好的做法是都在构造函数内部初始化。

参考:C++11:深刻理解成员变量初始化顺序_c++11 属性初始化-CSDN博客

你可能感兴趣的:(c++,笔记,c++,前端)