将一个标准类型变量的值赋给另一种标准类型时,如果这两种类型兼容,则C++自动将这个值转换为接收变量的类型,这种称为C++的内置类型转换。例如:
long count = 8;
double time = 11;
int side = 3.33;
C++不自动转换不兼容的类型,例如:
int *p = 10;//类型不兼容,不可转换
因为左边是指针类型,右边是数字,是两个不同的概念,但可以使用强制类型转换完成。
int *p = (int *)10;//有效地表达式
将类定义成与基本类型或另一个类相关,使得从一种类型转换为另一种类型是有意义的。C++可以通过自动转换,或强制类型转换来完成。
以下是类Apple的构造函数声明。
Class Apple
{
public:
.......
Apple();
Apple(double m);
.......
};
对于Apple类则可以实现以下转换:
Apple myApple;
myApple = 18.3;
程序先使用构造函数Apple(double m)创建一个临时对象,将18.3作为初始值,随后,采用逐成员赋值方式将临时对象的内容复制到myApple中,这一过程称为隐式转换,它是自动进行的,不需要显示强制类型转换。只有接受一个参数的构造函数才能作为转换函数。
但是这种自动特性并非总是合乎需要的,这样容易导致意外的类型转换,因此,在C++中,可以使用关键字explicit关闭自动转换这种特性。即可以将构造函数声明为如下形式:
explicit Apple(double m);
这种形式就关闭了隐式转换,但仍然允许显示转换。一旦使用关键字explicit限定了构造函数,则只能用于显示转换。即上示转换只能用以下显示方式进行:
Apple myApple;
myApple = Apple(18.3);
或
myApple = (Apple)18.3;
转换函数
在前面通过定义构造函数,能将数字转换为对象,那么,通过转换函数,也能将对象转换为数字。转换函数是用户定义的强制类型转换,可以像使用强制类型转换那样使用他们。例如:
Apple myApple(23.5);
double it = double(myApple);
double its = (double)myApple;
以上形式中,编译器将查看是否定义了相应的转换函数,否则,将会生成错误消息。
要转换 typeName 类型,需要的转换函数形式如下:
operator typeName();
typeName指出要转换成的类型,因此,不需要指出返回类型。转换函数是类方法,需要通过类对象来调用。
注意:
- 转换函数必须是类方法;
- 转换函数不能指定返回类型;
- 转换函数不能有参数。
转换为double类型的函数原型如下:
operator double();
转换成int类型的函数原型如下:
operator int();
总结
C++为类提供以下类型转换:
- 只有一个参数的类构造函数用户将类型与该参数相同的值转换为类类型。例如,将double值赋给类对象时,接受double参数的构造函数将自动被调用。但是,在构造函数中用explicit可防止隐式转换,只允许显示转换。
- 被称为转换函数的特殊类成员运算符函数,将用于将类对象转换为其他类型。转换函数是类成员,没有返回类型,没有参数。将类对象赋给其他标准类型或强制转换为其他标准类型时,该转换函数将自动被调用。
- 过多的转换函数将导致二义性,因此,转换函数在需要的时候才定义。