c++构造当中的一些坑

690阅读 0评论2021-03-02 stolennnxb
分类:C/C++

1. 当写了一个空类,c++编译器会为其默默的编写如下几个函数:default构造函数,copy构造函数,析构函数(non-virtual,除非其base class的析构函数有virtual声明),copy assignment 操作符,只有当这些函数被调用,它们才会被编译器创建出来~如果声明了一个或多个构造函数,编译器不再为它创建default 构造函数,类内含有const或者reference成员,需要自己实现copy assignment 操作符,编译器无法默认搞定,它会两手一摊的~

2. 拒绝copy constructor 和copy assignment的方法之一就是声明之,然后private。如果在member函数或者friend函数之内调用,链接器会报错,想要移到编译期报错的方式就是实现一个copy constructor 和 copy assignment operator都被声明为private的基类,其derived class如果copy 或者assignment 则编译期间报错。

3. 为多态基类声明virtual 析构函数,防止“局部销毁”,且继承含有non-virtual析构函数的基类并不是一个好主意(所有STL容器、string等)。如果class的设计目的不是作为base class 使用,或不是为了具备多态性,就不该声明virtual析构函数



4. 虚函数表指针通常指向的是一个由函数指针构成的数组,当对象调用某一virtual函数,实际被调用的函数取决于该对象的vptr所指的vtbl


5. 可以为某些想要成为abstract class的类声明一个纯虚的析构函数,但是为了避免其derived class在析构的时候对基类的析构函数的调用 的时候编译报错,需要对其实现一个空的析构


6. 在derived class对象的 base class 构造期间,对象的类型是base class, 而不是derived class。不止virtual函数会被编译器解析至base class,若使用运行期间类型信息,也会把对象视为base class类型。对象在derived class 构造函数开始执行前不会成为一个derived class对象。析构同理~

7. 在写copy constructor 的时候,一定要保证全部成员都被copy,如果是derived class, 一定要注意调用其父类的copy constructor 以及 其父类的copy assignment operator
上一篇:c++碎碎念之const以及初始化
下一篇:leetcode滑动窗口(239题)