前段时间被人问及“初始化列表和构造有什么区别?”我竟一时语塞,只好回头
拿起几本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! */
}
};
对很多人而言,这是什么直观写法,为什么就错了呢?其实这本质上相当于写: