0. 问题:普通类型与类类型之间能否进行类型转换?类类型之间能否进行类型转换?
1. 再论构造函数
构造函数可以定义不同类型的参数,当参数满足有且仅有一个参数, 参数是基本类型或其它类型时,这样的构造函数称为转换构造函数。
2.编译器的行为
编译器尽力尝试的结果是隐式类型转换,但隐式类型转换会让程序以意想不到的方式进行工作,是工程中bug的重要来源。
- 工程中通过
explicit
关键字杜绝编译器的转换尝试,转换构造函数被explicit
修饰时只能进行现实转换 - 转换方式:
static_cast<ClassName> (value); // 推荐使用
ClassName(value); // 显示调用构造函数
(ClassName)value; // 不推荐使用
编程说明:普通类型转换为类类型
#include <iostream>
#include <string>
using namespace std;
class Test
{
int mValue;
public:
Test()
{
}
explicit Test(int i) // 添加explicit关键字,防止编译器自动隐式类型转换
{
mValue = i;
}
int value()
{
return mValue;
}
Test operator + (const Test& p)
{
Test ret(mValue + p.mValue);
return ret;
}
};
int main()
{
Test t;
t = static_cast<Test>(5); // 显示强制转换
cout << "t = " << t.value() << endl;
Test r;
r = t + static_cast<Test>(10); // 显示强制转换
cout << "r = " << r.value() << endl;
return 0;
}
输出结果
t = 5
r = 15
3. 小结
- 转换构造函数只有一个参数
- 转换构造函数的参数类型时其它类型
- 转换构造函数在类型转换时被调用
- 隐式类型转换是工程中bug的重要来源
-
explicit
关键字用于杜绝隐式类型转换