【深入理解C++】从初始化列表和构造函数谈C++的初始化机制

本文深入探讨了C++中的初始化机制,包括初始化列表、构造函数体、类外初始化和类中声明时直接赋值。文章强调了初始化列表的重要性,特别是在处理const、引用和无默认构造函数的成员时。还提到了静态成员的初始化顺序,并给出了多个示例以阐明类的初始化全过程。

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

   前段时间被人问及“初始化列表和构造有什么区别?”我竟一时语塞,只好回头

拿起几本C++的大部头书,打开VS2012和vim开始倒腾。最后总结出如下几点,希望

对大家理解C++能有些帮助。(题外话:我认为好的技术书籍和师者对人最大的帮助

就是:帮助学者节省时间。)

 

综合而言,C++中类的初始化操作有四个部分组成:

1.初始化列表:所有类非静态数据成员都可以在这里初始化,

            所有类静态数据成员都不能在这里初始化

2.构造函数体:对于类非静态数据成员:

                const型成员不能在这里初始化

                引用型成员不能在这里初始化

                没有默认构造函数的成员不能在这里初始化

            对于类静态数据成员:

                可以在这里修改可修改的静态成员,但静态成员必须已经在类外部初始化

3.类外初始化:除一个特例外,所有类static数据成员必须在这里初始化,

            特例是类static const int数据成员可以在这里初始化,也可以在成员的声明处初始化

4.类中声明时直接赋值:类static const int数据成员可以选在这里初始化。

 

直接罗列这样的规则,是我国大多数教科书的展开方式,记得经典的三部曲吗?

  (1)定义

  (2)定理

  (3)例题

   至于来龙去脉就只能靠我们这些学子的悟性了。何其苦载!事实证明需要理清

一些定理和思想的来龙去脉往往需要比这个定理更加广阔的知识和视野,让学生拿

着空洞的课本靠领悟?(不要意思,又吐槽了)

 

让我们从一段简单的代码开始:

class A {
    const int x;
public:
    A() {
        this->x = 1; /* Error! */
    }
};

对很多人而言,这是什么直观写法,为什么就错了呢?其实这本质上相当于写:


                
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值