类型转换系列2

对于类类型的类型转换,通过定义类型转换运算符完成.转换构造函数和类型转换运算符共同定义了类类型转换.类型转换运算符没有显式的返回类型,也没有星灿,而且必须定义成类的成员函数.类型转换运算符一般不改变待转换对象的内容.因此,类型转换运算符一般是const的.

类型转换运算符函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
/**
* SmallInt既定义了向类类型的转换,也定义了从类类型向其他类型的转换
* 构造函数将算类型的值转换成SmallInt类型对象,类型转换运算符将SmallInt对象转换成int
*/
class SmallInt {
public:
SmallInt(int i = 0) : val(i) {
if (i < 0 || i > 255) {
throw std::out_of_range("Bad SmallInt value");
}
}

// 类型转换运算符:把类类型SmallInt转成int类型
operator int() const { return val; }

private:
std::size_t val;
};


int main(){
SmallInt s = 4; // s是一个SmallInt类型对象,val=4

cout << s + 4 << endl; // 8

SmallInt si = 3.14; // si是一个SmallInt类型对象,val=3

cout << si + 3.14 << endl; // 6
return 0;
}
  • SmallInt s = 4首先将4隐式地转换为SmallInt,然后调用SmallInt::operator=(拷贝赋值运算符).

  • s + 4首先将s隐式地转换成int,然后执行整数的加法

  • si = 3.14, 首先内置类型转换将double实参转换成int,然后再调用SmallInt(int)构造函数

  • 在表达式si + 3.14中, 首先SmallInt类型转换运算符将si转换成3,然后内置类型转换将所得int继续转换为double.

    • 编译器一次只能执行一个用户定义的类型转换,但是隐式的用户定义类型转换可以置于一个标准类型转换之前或之后