Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1877930
  • 博文数量: 184
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 2388
  • 用 户 组: 普通用户
  • 注册时间: 2016-12-21 22:26
个人简介

90后空巢老码农

文章分类

全部博文(184)

文章存档

2021年(26)

2020年(56)

2019年(54)

2018年(47)

2017年(1)

我的朋友

分类: C/C++

2021-03-02 11:30:40

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
阅读(777) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~