本文共 1587 字,大约阅读时间需要 5 分钟。
1. 定义
类型转换运算符:(既然一个类类型可以由实参类型对象隐式转换而来,那么)一个类类型的值也可以转换成其它类型
形式 : operator type() const type 表示某种类型,类型转换运算符可以面向任意类型(除void之外)进行定义,只要该类型能够作为函数的返回类型用户定义的类类型转换 = 转换构造函数+ 类型转换运算符
eg.
class SmallInt{ public: SmallInt(int i= 0):val(i) { if(i < 0 || i > 255) throw std::out_of_range("Bad SmallInt value"); } operator int() const{ return val;}private: std::size_t val;}
构造函数将算术类型的值转换成 SmallInt,而类型转换运算符将 SmallInt 对象转换成 int 。
隐式的用户定义类型转换可以置一个标准(内置)类型转换之前或之后SmallInt si;si = 4; //首先将4隐式转换成SmallInt,然后调用SmallInt::operator= int n = si + 3;//首先将si隐式地转换成int,然后执行整数加法cout << n << endl;//调用lambda函数对象
2. 设计原则
eg.
class SmallInt{ public: //编译器不会自动执行这一类型转换 int operator int() const;//error:指定了返回类型 operator int(int = 0) const;//error:指定了形参 }
3. 隐式类型转换
3.1 隐式可能产生意外结果
eg.
//使用 istream 的 bool 类型转换运算符将 cin 转换成 bool, 可能会变成1或0左移42位int i = 42;cin << i;
3.2 为了阻止隐式转换,使用explicit指定显式的类型转换运算符,之后可以使用显式的强制类型转换
class SmallInt{ public: //编译器不会自动执行这一类型转换 explicit operator int() const { return val;}}//显式地请求类型转换SmallInt si=3;int n = si + 3;//errorstatic_cast (si)+3;//
while(cin >> value)
输入运算符负责把数据读到 value 中,并返回 cin,为了对条件求值,cin 被 istream operator bool 类型转换函数隐式地执行了转换,如果 cin 的条件状态是 good,则函数返回真,否则返回假。
3.3. 当表达式出现在下列位置时,显式的类型转换被隐式执行:
[1]
转载地址:http://lrl.baihongyu.com/