- 4
- 0
- 约4.27千字
- 约 6页
- 2017-08-05 发布于重庆
- 举报
109C类型转换函数(类型转换运算符函数)
用转换构造函数可以将一个指定类型的数据转换为类的对象。但是不能反过来将一个类的对象转换为一个其他类型的数据(例如将一个Complex类对象转换成double类型数据)。C++提供类型转换函数(type conversion function)来解决这个问题。类型转换函数的作用是将一个类的对象转换成另一类型的数据。如果已声明了一个Complex类,可以在Complex类中这样定义类型转换函数:? ? operator double( )? ? {? ? ? ? return real;? ? }函数返回double型变量real的值。它的作用是将一个Complex类对象转换为一个double型数据,其值是Complex类中的数据成员 real的值。请注意,函数名是operator double,这点是和运算符重载时的规律一致的(在定义运算符“+”的重载函数时,函数名是operator +)。类型转换函数的一般形式为:? ? operator 类型名( )? ? {? ? ? ? 实现转换的语句? ? }在函数名前面不能指定函数类型,函数没有参数。其返回值的类型是由函数名中指定的类型名来确定的。类型转换函数只能作为成员函数,因为转换的主体是本类的对象。不能作为友元函数或普通函数。从函数形式可以看到,它与运算符重载函数相似,都是用关键字operator开头,只是被重载的是类型名。double类型经过重载后,除了原有的含义 外,还获得新的含义(将一个Complex类对象转换为double类型数据,并指定了转换方法)。这样,编译系统不仅能识别原有的double型数据, 而且还会把Complex类对象作为double型数据处理。那么程序中的Complex类对具有双重身份,既是Complex类对象,又可作为double类型数据。Complex类对象只有在需要时才进行转换,要根据表达式的上下文来决定。转换构造函数和类型转换运算符有一个共同的功能:当需要的时候,编译系统会自动调用这些函数,建立一个无名的临时对象(或临时变量)。[例10.9] 使用类型转换函数的简单例子。
#include?iostream
using?namespace?std;
class?Complex
{
public:
Complex(?){real=0;imag=0;}
Complex(double?r,double?i){real=r;imag=i;}
operator?double(?)?{return?real;}?//类型转换函数
private:
double?real;
double?imag;
};
?
int?main(?)
{
Complex?c1(3,4),c2(5,-10),c3;
double?d;
d=2.5+c1;//要求将一个double数据与Complex类数据相加
coutdendl;
return?0;
}
对程序的分析: 1) 如果在Complex类中没有定义类型转换函数operator double,程序编译将出错。因为不能实现double 型数据与Complex类对象的相加。现在,已定义了成员函数 operator double,就可以利用它将Complex类对象转换为double型数据。请注意,程序中不必显式地调用类型转换函数,它是自动被调用的,即隐式调 用。在什么情况下调用类型转换函数呢?编译系统在处理表达式 2.5 +cl 时,发现运算符“+”的左侧是double型数据,而右侧是Complex类对象,又无运算符“+”重载函数,不能直接相加,编译系统发现有对 double的重载函数,因此调用这个函数,返回一个double型数据,然后与2.5相加。 2) 如果在main函数中加一个语句: ? ? c3=c2; 请问此时编译系统是把c2按Complex类对象处理呢,还是按double型数据处理?由于赋值号两侧都是同一类的数据,是可以合法进行赋值的,没有必要把c2转换为double型数据。 3) 如果在Complex类中声明了重载运算符“+”函数作为友元函数: ? ? Complex operator+ (Complex c1,Complex c2)//定义运算符“+”重载函数 ? ? { ? ? ? ? return Complex(c1.real+c2.real, c1.imag+c2.imag); ? ? } 若在main函数中有语句 ? ? c3=c1+c2; 由于已对运算符“+”重载,使之能用于两个Complex类对象的相加,因此将c1和c2按Complex类对象处理,相加后赋值给同类对象c3。如果改为 ? ? d=c1+c2; //d为double型变量 将c1与c2两个类对象
您可能关注的文档
最近下载
- 国之脊梁中国科学家的家国天下阅读分享PPT课件.pptx VIP
- 个人简历模板表格简历模板免费下载.docx VIP
- (2026春新版)部编版三年级道德与法治下册全册教案.doc
- 健康体适能评定理论与方法.pptx VIP
- JR DSX7 全中文说明书 和 Spektrum DX7 全中文说明书.docx VIP
- 2020年高级经济师(人力资源)考试真题及参考答案 .pdf VIP
- 社会体育指导专题9 (傅浩坚).ppt VIP
- 2026年山东司法警官职业学院单招综合素质考试模拟试题及答案解析.docx VIP
- 社会体育指导专题8(傅浩坚).pptx VIP
- 肝硬化门静脉高压症食管、胃底静脉曲张破裂出血诊治专家共识(2024版).pptx VIP
原创力文档

文档评论(0)