一、强制类型转换运算符
static_cast
- 任何具有明确定义的类型转换,只要不包含底层const,都可以用static_cast。
- 用于非多态类型的转化。
dynamic_cast
- 用于多态类型的转换
- 执行运行时类型检查
- 只适用于指针或引用
- 对不明确的指针的转换将失败(返回 nullptr),但不引发异常
- 可以在整个类层次结构中移动指针,包括向上转换、向下转换
const_cast
- 用于删除const、volatile和__unaligned特性(如将const int类型转换为int 类型)
reinterpret_cast
- 为运算对象的位模式提供较低层次上的重新的解释。
- 允许将任何指针转换为任何其他指针类型
- 也允许将任何整数类型转换为任何指针类型以及反向转换
- reinterpret_cast 运算符不能丢掉 const、volatile 或 __unaligned 特性。
二、运行时类型识别
- typeid运算符,用于表达式的类型
- dynamic_cast运算符,用于将基类类型的指针或引用安全地转换成派生类的指针或引用。
type_id
- type_id 运算符允许在运行时确定对象的类型
- type_id 返回一个 type_info 对象的引用
- 如果想通过基类的指针获得派生类的数据类型,基类必须带有虚函数
- 只能获取对象的实际类型
type_info
- type_info 类描述编译器在程序中生成的类型信息。此类的对象可以有效存储指向类型的名称的指针。type_info 类还可存储适合比较两个类型是否相等或比较其排列顺序的编码值。类型的编码规则和排列顺序是未指定的,并且可能因程序而异。
- 头文件:typeinfo
三、拷贝构造函数
在C++中,下面三种对象需要调用拷贝构造函数(有时也称“复制构造函数”):
- 一个对象作为函数参数,以值传递的方式传入函数体;
- 一个对象作为函数返回值,以值传递的方式从函数返回;
- 一个对象用于给另外一个对象进行初始化(常称为复制初始化);
通常的原则是:①对于凡是包含动态分配成员或包含指针成员的类都应该提供拷贝构造函数;②在提供拷贝构造函数的同时,还应该考虑重载"="赋值操作符号。
https://blog.csdn.net/zhaohuaonline/article/details/19497129
C++成员初始化列表详解
- 从必要性:
a. 成员是类或结构,且构造函数带参数:成员初始化时无法调用缺省(无参)构造函数
b. 成员是常量或引用:成员无法赋值,只能被初始化 - 从效率上:
如果在类构造函数里赋值:在成员初始化时会调用一次其默认的构造函数,在类构造函数里又会调用一次成员的构造函数再赋值。
如果在类构造函数使用初始化列表:仅在初始化列表里调用一次成员的构造函数并赋值。
https://blog.csdn.net/poundssss/article/details/49383603
https://www.cnblogs.com/BlueTzar/articles/1223169.html
https://blog.csdn.net/zizi7/article/details/52383015
网友评论