再论类型转换
标准数据类型之间会进行隐式的类型安全转换
转换规则如下:
问题
普通类型与类类型之间能否进行类型转换?
类类型之间能否进行类型转换?
再论构造函数
构造函数可以定义不同类型的参数
参数满足下列条件时称为转换构造函数
- 有且仅有一个参数
- 参数是基本类型
- 参数是其他类类型
旧式的 C 方式强制类型转换
编译器的行为
编译器会尽力尝试让源码通过编译
编译器尽力尝试的结果是隐式类型转换
隐式类型转换
- 会让程序以意想不到的方式进行工作
- 是工程中 bug 的主要来源
工程中通过 explicit 关键字杜绝编译器的转换尝试
转换构造函数被 explicit 修饰时只能进行显示转换
- 转换方式
- static_cast<ClassName>(value);
- ClassName(value);
- (ClassName)value; // 不推荐
问题
类类型是否能够类型转换到普通类型?
类型转换函数
C++ 类中可以定义类型转换函数
类型转换函数用于将类对象转换为其他类型
语法规则:
类型转换函数
- 与转换构造函数具有同等的地位
- 使得编译器有能力将对象转换为其他类型
- 编译器能够隐式的使用类型转化函数
编译器会尽力尝试让源码通过编译
类类型之间的相互转换?!
类型转换函数 vs 转换构造函数
无法抑制隐式的类型转换函数调用
类型转换函数可能与转换构造函数冲突
工程中以 TypeToType() 的公有成员函数代替类型转换函数
小结
转换构造函数只有一个参数
转换构造函数的参数类型是其他类型
转换构造函数在类型转换时被调用
隐式类型转换是工程中 bug 的主要来源
explicit 关键字用于杜绝隐式类型转换
C++ 类中可以定义类型转换函数
类型转换函数用于将类对象转换为其他类型
类型转换函数与转换构造函数具有同等的地位
工程中以 TypeToType() 的公有成员函数代替类型转换函数