C++对象模型(17)-- 构造函数语义学:成员初始化列表

本文详细介绍了C++中初始化列表的使用场景、执行时机、成员变量的初始化顺序以及其相对于构造函数内初始化的效率优势。包括对引用类型、const类型、继承情况和类内类初始化的讲解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、必须用初始化列表的场景

(1)成员变量是引用类型,必须在初始化列表中初始化。

(2)成员变量是const类型,必须在初始化列表中初始化。

(3)如果类继承自一个父类,并且父类中有带初始化列表的构造函数,必须在初始化列表中初始化父类。

class Base {
public:
    Base(int i) { }
};

class Derive:public Base {
public:
    Derive(int i) : Base(i){}
};

(4)成员变量是类类型,且这个类的构造函数带参数。

class Item {
public:
    Item(int i) { }
};

class MyDemo {
public:
    MyDemo(int i) : item(i){}

    Item item;
};

2、初始化列表的执行时机

初始化列表是在构造函数之前执行的。

我们可以用下面的代码来验证:

class Item {
public:
    Item() { }
    Item(const Item& _item) {
        cout << " Item拷贝构造函数" << endl;
    }
};
class Derive {
public:
    Derive() { cout << " Derive默认构造函数" << endl; }
    Derive(Item& _item) : item(_item) { cout << " Derive带初始化列表构造函数" << endl; }

    Item item;
};

int main()
{
    Item _item;
    Derive derive(_item);

    return 0;
}

执行结果如下:

从运行结果看,初始化列表是在构造函数之前运行的。

3、按成员变量的声明顺序初始化,而不是根据初始化列表中的前后顺序。

class X{
public: 
    X(int val) : j(val), i(j){}
private:
    int i;
    int j;
}

其实在这个时候,构造函数是这么初始化的:

X::X(int val){
    i = j;
    j = val;
}

所以最终的结果是j = val, 但i的值未知。

4、初始化列表的优点

一般地,放在构造函数初始化列表中进行初始化,比放在构造函数中初始化效率更高。

我们可以通过代码来验证这个结论:

(1)构造函数中初始化

class Item {
public:
    Item() { 
        cout << " Item默认构造函数" << endl; 
    }

    Item(int i) { 
        cout << " Item(int)构造函数" << endl; 
    }

    Item(const Item& _item) {
        cout << " Item拷贝构造函数" << endl;
    }

    Item& operator = (const Item& _item) {
        cout << " Item拷贝赋值运算符" << endl;

        return *this;
    }
};

class Derive {
public:
    Derive(int i){ 
        item = Item(i);
        cout << " Derive带初始化列表构造函数" << endl; 
    }

    Item item;
};

int main()
{
    Derive derive(2);

    return 0;
}

运行结果:

(2)初始化列表中初始化

Derive(int i) : item(i){}

运行结果:

可以看到,初始化列表初始化时少了1次默认构造函数和1次拷贝赋值运算符。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值