什么是隐式转换:
c++中的基本类型并非完全对立,部分类型之间是可以进行隐式转换的,所谓隐式转换,是指不需要用户干预,编译器私下进行的类型转换行为,很多时候用户都不知道具体进行了哪些转换
为什么要进行隐式转换:
隐式转换可以让程序员在两个不同类型的数据直接进行操作,而不用自行转换类型,隐式转换给程序开发者带来了不小的便捷
隐式转换的原则:
- 基本数据类型的转换以取值范围作为转换基础(保证精度不丢失)
- 隐式转换发生在从小 ——> 大的转换中。如char转换为int,int转换成double
隐式转换发生的条件:
- 混合类型的算术运算表达式中。例如:
int a = 3;
double b = 4.5;
double c=a + b;
// a将会被自动转换为double类型,转换的结果和b进行加法操作
- 不同类型的赋值操作
int a=‘a’;//字符a转换成对应ASCII码的整数赋值给a
double b=1;//将1转换成1.0赋值给b
- 函数参数传值
void func(double a);
func(1); // 1被隐式的转换为double类型1.0
- 函数返回值
double add(int a, int b)
{
return a + b;
} //运算的结果会被隐式的转换为double类型返回
隐式转换的风险:一般存在于自定义的类构造函数中
按照默认规定,只有一个参数的构造函数也定义了一个隐式转换,将该构造函数对应数据类型的数据转换为该类对象。
例子:
class A
{
public:
A(int i = 5)
{
m_a = i;
}
void printm()
{
cout << m_a << endl;
}
private:
int m_a;
};
int main()
{
A s;//此时调用构造函数,s.m_a应该等于5
s.printm();
s = 10;//我们没有重载'='运算符,但是去可以把内置的int类型赋值给了对象A.
s.printm();
//实际上,10被隐式转换成了下面的形式,所以才能这样.
//s = A temp(10);
system("pause");
return 0;
}
运行结果:
禁止类构造函数的隐式转换:
C++中提供了explicit关键字,在构造函数声明的时候加上explicit关键字,能够禁止隐式转换。
在上述代码的构造函数上加上explicit,则会发生:
s=10的操作变成非法的了。这样就可以有效的防止隐式转换的发生,从而能够对程序进行精确控制,达到提高品质的目的。