C++中类成员变量在初始化列表中的初始化顺序

引子:我们知道,C++中类成员变量的初始化顺序与其在类中的声明顺序是有关的。

先看代码:

class TestClass1
{
public:
    TestClass1() {
        cout << "TestClass1()" << endl;
    }
    TestClass1(const TestClass1&) { cout << "TestClass1(const TestClass1&)" << endl; }
    TestClass1& operator=(const TestClass1&) { cout << "TestClas1s& operator=(const TestClass1&)" << endl; return *this; }
    ~TestClass1() {
        cout << "~TestClass1()" << endl;
    }
};

class TestClass2
{
public:
    TestClass2() {
        cout << "TestClass2()" << endl;
    }
    TestClass2(const TestClass2&) { cout << "TestClass2(const TestClass2&)" << endl; }
    TestClass2& operator=(const TestClass2&) { cout << "TestClass2& operator=(const TestClass2&)" << endl; return *this; }
    ~TestClass2() {
        cout << "~TestClass2()" << endl;
    }
};

class Test
{
public:
    Test() = default;
    Test(TestClass1& tc1, TestClass2& tc2) :m_tc2(tc2), m_tc1(tc1){}
private:
    TestClass1 m_tc1;
    TestClass2 m_tc2;
};


int main()
{
    Test t;
}

程序结果为:

现象:先调用TestClass1的构造函数,再调用TestClass2的构造函数。

原因:在类Test中,m_tc1变量声明在m_tc2变量之前,故m_tc1在m_tc2之前初始化。

 

问题:在列表初始化的构造函数中,将m_tc2放在m_tc1之前,是否可以让m_tc2在m_tc1之前初始化?

代码设计

int main()
{
    TestClass1 tc1;
    TestClass2 tc2;
    cout << "/**************************************************************************************/" << endl;
    Test t(tc1, tc2);
}

运行结果为:

可以看到:仍然是TestClass1的构造函数先被调用,TestClass2的构造函数接着被调用。

结论:C++中类成员变量的初始化顺序与其在类中的声明顺序是有关的,而与其在初始化列表中的顺序无关。

 

再举一个例子:

然后我将代码写成这样:

class Test
{
public:
    Test() = default;
    Test(TestClass1& tc1, TestClass2& tc2):m_tc2(tc2){}
private:
    TestClass1 m_tc1;
    TestClass2 m_tc2;
};

int main()
{
    TestClass1 tc1;
    TestClass2 tc2;
    cout << "/**************************************************************************************/" << endl;
    Test t(tc1, tc2);
}

 

注意与之前代码的差别:我们在初始化列表中只初始化了m_tc2,没有动m_tc1。

运行结果:

 

结果分析:在初始化Test的对象t时,由于m_tc1的声明顺序在m_tc2的声明顺序之前,所以t会想要先初始化m_tc1,但是它在初始化列表中没有找到初始化m_tc1的内容,于是它只好调用m_tc1的默认构造函数了,完成m_tc1的初始化后,再根据初始化列表中的内容初始化m_tc2。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值