当前位置: 首页 > 文档资料 > C++大学教程 >

8.9 类型之间的转换

优质
小牛编辑
110浏览
2023-12-01

大多数程序能处理各种数据类型的信息。有时候所有的操作还会集中于某一种类型上,例如,整数加整数还是整数(只要结果不是太大,能用整数表示出来)。但是,常常需要将一种类型的数据转换为另外一种类型的数据,赋值、计算、给函数传值以及从函数返回值都可能会发生这种情况。对于内部的类到,编译器知道如何转换类型。程序员也可以用强制类型转换运算符实现内部类型之间的强制转换。

但是怎样转换用户自定义类型呢?编译器不知道怎样实现用户自定义类型和内部类型之间的转换,程序员必须明确地指明如何转换。这种转换可以用转换构造函数实现,也就是使用单个参数的构造函数,这种函数仅仅把其他类型(包括内部类型)的对象转换为某个特定类的对象。本章梢后要用一个转换构造函数把正常的 char* 类型的字符串转换为类 String 的对象。

转换运算符(也称为强制类型转换运算符)可以把一种类的对象转换为其他类的对象或内部类型的对象。这种运算符必须是一个非static成员函数,而不能是友元函数。
函数原型:

A::operator char *() const;

声明了一个重载的强制类型转换运算符函数,它根据用户自定义类型A的对象建立一个临时的char*类型的对象。重载的强制类型转换运算符函数不能指定返回类型(返回类型是要转换后的对象类型)。如果s是某个类对象,当编译器遇到表达式(char*),时,会产生函数调用s.operator char*(),操作数s是调用成员函数 operator char* 的类对象s。
为了把用户自定义类型的对象转换为内部类型的的对象或用户自定义的其他类型的对象,我们可以定义重载的强制类型转换运算符函数。函数原型:

A::operator int()const;
A::operator otherClass()const;

声明了两个重载的强制类型转换运算符函数,分别用来把用户自定义类型A的对象转换为一个整数和用户自定义类型 otherClass 的对象。

强制类型转换运算符和转换构造函数一个很好的特点就是:当需要的时候,编译器可以为建立一个临时对象而自动地调用这些函数。例如,如果用户自定义的类String的某个对象s出现在程序中需要使用char*类型的对象的位置上,例如:

cout << s;

编译器调用重载的强制类型转换运算符函数 operator char* 将对象转换为 char* 类型,并在表达式中使用转换后的char*类型的结果。String 类提供该转换运算符后,不需要重载流插入运算符用 cout 输出 String。