C++ 构造语义

本文是《深度探索C++对象模型》的读书笔记,主要根据自己的理解整理一下C++对象构造的实现细节以及其在实际编程中所带来的影响。

一. 构造函数

C++95标准对构造函数如下描述:

对于 class X,如果没有任何user-declared constructor,那么会有一个default constructor被隐式声明出来…..一个被隐式声明出来的 default constructor 将是一个trivial(浅薄无能的,没啥用的) constructor ……

上面的话摘自《深度探索C++对象模型》P40,由于其省略了其中c++标准的部分内容,因此很容易造成误解:

编译器隐式生成的构造函数都是 trivial constructor …..

事实上,描述中提到 default constructor 被隐式声明出来(满足语法需要),而该构造函数是否被编译器合成(实现或定义),取决于编译器是否需要在构造函数中做些额外工作,一个没有被合成的 default constructor 被视为 trivial constructor(这也是c++标准原话的意思),而当编译器在需要时合成了构造函数,那么该类构造函数将被视为 nontrivial。

另外,一个定义了 user-decalred constructor(用户定义的任何构造函数) 的类被视为具有 nontrivial constructor。

下面将着重讨论编译器隐式声明的构造函数在哪种情况下需要被合成(nontrivial),哪种情况下无需被合成(trivial):

0%