9.7.2 由自定义类向其他类型的转换

    上节说明了由其他类型向自定义类型的转换,那能否反过来,由自定义类型转换成其他类型呢?答案是肯定的,通过转换函数,便可实现自定义类型向其他类型的转换。

    自定义类型是用户定义的强制类型转换函数,如何创建强制类型转换函数呢?需要在类中定义如下形式的转换函数。

    operator目标类型名();

    需要注意以下几个使用要点。

    ❑转换函数必须是成员函数形式,不能是友元函数形式。

    ❑转换函数不能指定返回类型,但在函数体内必须用return语句以传值方式返回一个目标类型的变量。

    ❑转换函数不能有参数。

    如示例代码9.13所示。

    代码9.13 由自定义类型转换为其他类型Conversion2


    <————————————文件名:example913.cpp———————————————> 01 #include<iostream> 02 using namespace std; 03 class anotherpoint//anotherpoint类定义 04 { 05 private://private成员列表 06 double x; 07 double y; 08 public: 09 anotherpoint(double xx=1,double yy=1)//构造函数,带默认参数值 10 { 11 x=xx; 12 y=yy; 13 } 14 void print()//成员函数,输出点的信息 15 { 16 cout<<"("<<x<<","<<y<<")"<<endl; 17 } 18 }; 19 class point//point类定义 20 { 21 private://private成员列表 22 int xPos; 23 int yPos; 24 public: 25 point(int x=0,int y=0)//构造函数,带默认参数值 26 { 27 xPos=x; 28 yPos=y; 29 } 30 operator int()//定义point向int型的转换函数int 31 { 32 return xPos; 33 } 34 operator double()//定义point向double型的转换函数double 35 { 36 return xPos*yPos; 37 } 38 operator anotherpoint()//定义point向anotherpoint型的转换函数anotherpoint 39 { 40 return anotherpoint(xPos,yPos); 41 } 42 43 }; 44 45 int main() 46 { 47 point p1(4,5);//声明一个point类变量p1 48 49 int x1=p1;//p1赋值给一个int型变量,point中的转换函数int被隐式调用 50 cout<<x1<<endl; 51 52 double dX=p1;//p1赋值给一个double型变量,point中的转换函数double被隐式调用 53 cout<<dX<<endl; 54 anotherpoint p2;//声明anotherpoint类对象p2,构造函数采用默认值 55 //p1赋值给p2,point中的转换函数anotherpoint被隐式调用 56 p2=p1;//等价于p2=another(p1.xPos,p1.yPos) 57 p2. print();//看p2是否修改成功 58 return 0; 59 }

    【代码解析】在代码的point类中定义了int型、double型和anotherpoint型的转换函数,这使得由point类对象p1可以向int型变量x1、double型变量dX,anotherpoint型变量p2转换,在代码9.13中,这些转换都是隐式完成的。

    当然,也可以通过显式调用实现由自定义类向其他类的转换,调用格式如下所示。


    int x1=int(p1); double dX=double(p2); p2=anotherpoint(p1);

    注意

    类似于“int x1=(int)p1;”的C语言用法也是合法的,但并不推荐这样做。