某种类型转换为类类型
定义
接受一个参数的构造函数可用来将与该参数相同的类型转换为类类型,如:
Stonewt(double lbs);
因此,可以这样编写代码:
Stonewt myCat;
myCat=19.6; //使用Stonewt(double)将19.6转换为Stonewt类型
这里,使用构造函数Stonewt(double)创建一个临时的Stonewt对象,并将19.6作为初始化值,然后将其复制到myCat中。这种隐式转换是自动进行的,不需要进行强制类型转换。
多个参数的构造函数
只有接受一个参数的构造函数才能作为转换函数。除非给其他参数提供默认值。如:
Stonewt(int stn, double lbs = 0);
explicit关键字
将构造函数用作自动类型转换函数可能会带来意想不到的问题,explicit关键字用于屏蔽这种特性。
如声明时:explicit Stonewt(double lbs);
这将关闭自动的隐式转换,但仍然可以进行显式的强制类型转换:
Stonewt myCat;
myCat=19.6; //不可以
myCat=Stonewt(19.6); //可以
myCat=(Stonewt) 19.6; //可以
使用构造函数进行自动类型转换的情形:
- 将Stonewt对象初始化为double值时
- 将double值赋给Stonewt对象时
- 将double值传递给接受Stonewt参数的函数时
- 返回值被声明为Stonewt的函数试图返回double值时
类类型转换为其他类型
转换函数是用户定义的强制类型转换,可以像使用强制类型转换那样使用它们。
- 转换函数必须是类方法
- 转换函数不能指定返回类型
- 转换函数不能有参数
例如,转换为double类型的函数原型如下:
operator double();
double指出了要转换成的类型,因此不需要指定返回类型,但在函数定义中必须返回转换后的值;转换函数是类方法意味着:它需要通过类对象来调用,从而告知函数要转换的值,因此不需要参数。
class Stonewt
{
private:
int stone;
double pounds;
public:
...
operator int() const;
operator double() const;
};
...
Stonewt::operator int() const
{
return int (pounds+0.5);
}
Stonewt::operator double() const
{
return pounds;
}