C++基础:初始化列表

  基本写法

class CMyClass {
    CMyClass(int x, int y);
    int m_x;
    int m_y;
};

CMyClass::CMyClass(int x, int y) : m_y(y), m_x(m_y) {};

 

  构造函数参数存在class定义的类型时,使用初始化列表会少一次构造调用

#include <iostream>

using namespace std;

class Hand {
public:
    Hand() {
        cout << "调用Hand构造函数\n";
    };
};

class Person1 {
public:
    Hand m_hand;
    Person1(Hand &hand){
        m_hand = hand;  // 在这里进行第二次构造函数调用
    };
};

class Person2 {
public:
    Hand m_hand;
    Person2(Hand &hand) : m_hand(hand) {
    };
};

int main() {
    cout << "不使用初始化列表:\n";
    Hand hand1;
    Person1 p1 = Person1(hand1);

    cout << "\n 使用初始化列表:\n";
    Hand hand2;
    Person2 p2 = Person2(hand2);

    return 0;
}

/* 程序输出 */
/*
不使用初始化列表:
调用Hand构造函数
调用Hand构造函数

使用初始化列表:
调用Hand构造函数
*/

  必须使用初始化列表的情况:

  1.常量成员,因为常量只能初始化不能赋值,所以必须放在初始化列表里面;

using namespace std;

class Person1 {
public:
    const string m_realName;
    Person1(string name) : m_realName(name){};
};

 

  2.引用类型,引用必须在定义的时候初始化,并且不能重新赋值,所以也要写在初始化列表里面

using namespace std;

class thread_guard {
public:
    thread & m_thread;
    thread_guard(thread &t) : m_thread(t) {};
};


  3. 没有默认构造函数的类类型,因为使用初始化列表可以不必调用默认构造函数来初始化,而是直接调用拷贝构造函数初始化

#include <iostream>

using namespace std;

class Mind1 {
public:
    // 显示声明了构造函数,系统不会生成默认构造函数
    Mind1(string info) {
        cout << info << endl;
    };
};

//class Mind2 {
//private:
//    // 默认构造函数被声明为private类型, 系统不会生成默认构造函数
//    Mind2() {};
//};

class Person {
public:
    Mind1 m_mind1;
    // 只能使用初始化列表进行初始化
    Person(Mind1 &m1) : m_mind1(m1) {};
};

int main() {
    Mind1 mind1 = Mind1("mind1 info");
    Person p = Person(mind1);
    return 0;
}

初始化列表顺序

class foo
{
public:
    int i; int j;
    foo(int x):i(x), j(i) {}; // ok, 先初始化i,后初始化j
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值