MoreEffect[5] 谨慎定义类型转换函数
C++编辑器允许两种类型之间的隐式转换,继承了C的类型转换方法,因此可以将short类型值传入接收int类型值的函数并正确编译允许。隐式转换可以方便运算和函数调用,但错误的转换可能导致数据丢失,如int类型转为short类型,而且这样的隐式转换错误很难发现。
隐式类型转换也支持类,通过类的单参数构造函数和隐式类型转换运算符。我们可以选择是否提供这些函数来控制类的隐式转换。
单参数构造函数
指只有一个参数或第一个之后的参数都有默认值的构造函数。
class Awesome
{
public:
Awesome(int arg1, int arg2=1, int arg3=2)
{
cout << "init" << endl;
}
};
void Function(Awesome obj)
{
obj;
}
int main(void)
{
Awesome obj = 10;//int到Awesome
Function(10);
return 0;
}
使用explicit关键字声明单参数构造函数,编译器禁止隐式类型转换调用该构造函数。
class Awesome
{
public:
explicit Awesome(int arg1, int arg2=1, int arg3=2)
{
cout << "init" << endl;
}
};
void Function(Awesome obj)
{
obj;
}
int main(void)
{
Function(10);//error: conversion from 'int' to non-scalar type 'Awesome' requested
return 0;
}
隐式类型转换运算符
隐式类型转换运算符即C风格类型转换运算符,重载格式为:operator [类型符号]();:类型符号即转换之后返回的数据类型。
class Awesome
{
public:
operator int()
{
return 10;
}
};
void Function(int arg)
{
arg;
}
int main(void)
{
Awesome obj;
int val = obj;
val = 1 + obj;//obj转到int,再做加法
cout << obj << endl;//obj转到int 打印整型
Function(obj);
return 0;
}
如果要避免上述的隐式类型转换,又需要能够将对象转为其它类型的值,应该用返回该类型值的函数代替。
class Awesome
{
public:
int toInt(void) const
{
cout << "return" << endl;
return 10;
}
};
int main(void)
{
Awesome obj;
int val = obj;//error: cannot convert 'Awesome' to 'int' in initialization
return 0;
}
显式转换函数返回的方式不如类型转换符方便,但可以避免隐藏的类型转换。

浙公网安备 33010602011771号