C++构造函数对象初始化列表

对象初始化列表

    1)对象初始化列表出现的原因

        必须这样做   如果我们有一个类成员,它本身是一个类或者是一个结构,而且这个成员它只有一个带参数的构造函数,没有默认构造函数,这时要对这个类成员进行初始化,就必须调用这个类型员的带参数的构造函数。如果没有初始化列表,那么他将无法完成第一步。

#include<iostream>

using namespace std;

class A

{
public:
          A(int a)
          {
                    m_a = a;
          }
public:
          int getA()
          {

                    return m_a;

          }

private:
          int m_a;

};

//构造函数的初始化列表,解决:在B类中,组合了一个A类对象(A类设计了构造函数)

//根据构造函数的调用规则,设计A的构造函数,必须要用,没有机会初始化A

//新的语法 constructer::constructer():m1(v1),m2(v1,v2),m3(v3)

class B

{
public:
          B(int  m1,int m2) :a3(10), a4(11)

          {

                    m_b1 = m1;

                    m_b2 = m2;

          }
          B(int m1, int m2, int m3, int m4) :a3(m3), a4(m4)
          {

                    m_b1 = m1;

                    m_b2 = m2;

          }
public:
          int getB1()
          {

                    return m_b1;

          }
          int getB2()
          {

                    return m_b2;

          }
          int getA3()
          {

                    return a3.getA();

          }
          int getA4()
          {

                    return a4.getA();

          }

private:

          int m_b1;

          int m_b2;

          A a3;

          A a4;

};

int main()

{

          A a1(10);

          //B b1(8,9);

          B b1(1, 2, 3, 4);

          cout << b1.getB1()<<b1.getB2()<<b1.getA3()<<b1.getA4()<< endl;

          system("pause");



}
​构造函数的执行顺序

#include<iostream>

using namespace std;

class A

{

public:

          A(int a)

          {

                    m_a = a;

                    cout << "构造函数a"<<m_a<< endl;

          }

          ~A()

          {

                    cout << "析构函数a"<<m_a<< endl;

          }

private:

          int m_a;

};

class B

{

public:

          B(int m1, int m2, int m3, int m4) :a1(m3), a2(m4)

          {

                    b1 = m1;

                    b2 = m2;

                    cout << "构造函数b"<<b1<< endl;

          }

          ~B()

          {

                    cout << "析构函数b"<<b1<< endl;

          }

private:

          int b1;

          int b2;

          A a1;

          A a2;

};

//先执行 被组合对象的构造函数

//如果组合对象有多个 按照定义顺序

//析构函数与构造函数的调用顺序相反

//被组合对象的构造顺序与定义顺序有关系  与初始化列表的顺序没有关系

void objplay()

{

          B b1(1, 2, 3, 4);

}

void main()

{

          objplay();

          system("pause");

}

附结果

猜你喜欢

转载自blog.csdn.net/error0_dameng/article/details/82049825