C++ 不会为所有的class构造默认的constructor
(我们经常认为c++会为所有的class默认添加构造函数)
只有满足4个条件之一会添加构造函数
- 包含带有默认构造函数的对象成员的类
- 继承自带有默认构造函数的基类的类
- 带有虚函数的类
- 带一个虚基类的类
这4中情况会导致编译器必须为未申明构造函数的class, 生成一个默认的constructor. 更多情况下是不会去生成默认的构造函数的.
2. copy constructor 构造语义学
C++并不是为所有的类都够着copy constructor.
默认的情况是如果没有定义copy constructor, 那么一般情况下如果有copy constructor 操作, 默认的是执行bitwise copy semantics. 也就是位逐次拷贝.
当然 bistwise copy 是有条件的,当不满足bitwise copy 的条件的时候,就不能进行bitwise copy. 那么C++就会为该类添加默认的copy constructor. ( 这里我感觉就是深拷贝和浅拷贝的区别,很明显bitwise 是浅拷贝,直接将一个对象的data member 拷贝给同一个类的另一个对象. 而如果这里不能直接内存拷贝,则需要深拷贝.就是需要构造一个copy constructor了)
4种情况不满足bitwise copy. 也就是会调用构造函数
- 当一个class 内的一个member object,而这个object 声明了一个copy constructor时
- 当class 继承自一个bass class, 而这个bass class 有 copy constructor
- 当class申明了一个或多个 virtual functions 时
- 当class 派生自一个继承串链,其中一个或多个virtual base classes
copy assign constructor 构造语义学
跟上面的copy constructor 构造语义学一样, 如果能进行浅拷贝就浅拷贝, 不行的时候才会去生成assign operator
对象析构语义学.
只有在基类拥有析构函数,或者object member 拥有析构函数的时候,编译器在为类合成析构函数,否则都被视为不需要.
这几个默认生成的函数都是在需要的时候才会被编译器生成出来, 默认情况下是不会生成这些函数的.所以如果class 当成一个存结构体使用, 效率是和C 的stuct 是一样的