11.6.1 转换函数
程序清单 11.18将数字转换为 Stonewt对象。可以做相反的转换吗?也就是说,是否可以将 Stonewt对象转换为 double值,就像如下所示的那样?
Stonewt wolfe(285.7);
double host=wolfe:??possible ??
可以这样做,但不是使用构造函数。构造函数只用于从某种类型到类类型的转换。要进行相反的转换,必须使用特殊的 C++运算符函数–转换函数。
转换函数是用户定义的强制类型转换,可以像使用强制类型转换那样使用它们。例如,如果定义了从Stonewt到 double 的转换函数,就可以使用下面的转换:
Stonewt wolfe(285.7);
double host =double(wolfe);
//syntax #1
double thinker=(double)wolfe;//syntax#2
也可以让编译器来决定如何做:
Stonewt wells(20,3);
double star = wells;//implicit use of conversion function
编译器发现,右侧是 Stonewt类型,而左侧是 double 类型,因此它将查看程序员是否定义了与此匹配的转换函数。(如果没有找到这样的定义,编译器将生成错误消息,指出无法将 Stonewt赋给 double。)
那么,如何创建转换函数呢?要转换为typeName 类型,需要使用这种形式的转换函数:operator typeName();
请注意以下几点:
1,转换函数必须是类方法;
2,转换函数不能指定返回类型:
3,转换函数不能有参数。
例如,转换为 double 类型的函数的原型如下:operator double();
typeName(这里为 double)指出了要转换成的类型,因此不需要指定返回类型。转换函数是类方法意味着:它需要通过类对象来调用,从而告知函数要转换的值。因此,函数不需要参数。要添加将 stone wt对象转换为int类型和 double 类型的函数,需要将下面的原型添加到类声明中:
operator int();
operator double();
程序清单 11.19 列出了修改后的类声明。
//stonewt1.h -- definition for the stonewt class
#ifndef STONEWT1_H_
#define STONEWT1_H_
class Stonewt
{
private:
enum {Lbs_per_stn = 14}; //pouns per stone 转换因子
int stone; //whole stone 英石
double pds_left; //fractional pounds
double pounds; //entire weight in pounds 磅
public:
Stonewt(double lbs); //constructor for double pounds
Stonewt(int stn, double lbs); //constructor for stone,lbs
Stonewt(); //default constructor
~Stonewt();
void show_lbs()const; //show weight in pounds format
void show_stn()const; //show weight in stone format
//conversion functions
operator int() const;
operator int()const;
};
#endif // !STONEWT1_H_
程序清单 11.20是在程序清单11.18的基础上修改而成的,包括了这两个转换函数的定义。注意,虽然没有声明返回类型,这两个函数也将返回所需的值。另外,int转换将待转换的值四舍五入为最接近的整数,而不是去掉小数部分。例如,如果pounds为114.4,则 pounds +0.5等于114.9,int(114.9)等于 114。但是如果pounds为114.6,则pounds+0.5是115.1,而int(115.1)为 115。
下堂课讲新添加这两个函数行为的实现
339

被折叠的 条评论
为什么被折叠?



