一个有趣的程序:C++运算符重载中的“指鹿为马”
2014-05-12 16:14
411 查看
这个程序涉及到C++的运算符重载和隐含转换
代码如下
operator Horse()和operator int()都为类Deer的成员函数,对强制转换运算符(Horse类的强制转换和int类型的强制转换)进行了重载。
使Deer类的对象能够被强制转化为Horse对象和int类型。
两个隐含转换:
1.在函数void listen()中将传进去的Deer对象隐含的转化为Horse对象,调用了Horse对象的speak()函数,所以听到的是马说的话。
2.n = d+10;这一句将Deer的对象d隐含转化为int类型并参与运算。
测试:
1.显式调用重载函数,在main函数里面加上如下语句,输出结果注释在后面
d.operator Horse().speak(); //吾本千里马也!体重:40kg,奔跑时速:60km/h
d.operator int();//输出100
cout<<d<<endl;
operator 类名();
转换运算符的重载函数是没有返回类型的,它和类的构造函数,析构函数一样是不遵循函数有返回类型的规定的,他们都没有返回值。
2.定义转换函数时应注意如下几点:
(1)转换函数是用户定义的成员函数,但它要是非静态的。
(2)转换函数的不可以有返回值。(意思是声明中不可以有返回值)
(3)转换函数也不带任何参数。
(4)转换函数函数还不能定义为友元函数。
转换函数的名称是类型转换的目标类型,因此,不必再为它指定返回值类型;转换函数是被用于本类型的数值或变量转换为其他的类型,也不必带参数。
类中的构造函数完成其他类型到类类型的转换,而重载强制转换完成类类型到其他类型的转换。
代码如下
#include<iostream> using namespace std; class Horse { public: Horse(double weight = 0, double speed = 0); void speak()const; private: double weight,speed; }; Horse::Horse(double weight,double speed) { this->weight = weight; this->speed = speed; } void Horse::speak()const { cout<<"吾本千里马也!"<<"体重:"<<weight<<ends<<"奔跑时速:"<<speed<<endl; } class Deer { public: Deer(double weight = 0,double speed = 0); void speak(); operator Horse()const; operator int(); private: double weight,speed; }; Deer::Deer(double weight,double speed) { this->weight = weight; this->speed = speed; } void Deer::speak() { cout<<"我是如假包换的鹿"<<endl; } Deer::operator Horse()const { return Horse(weight,speed); } Deer::operator int() { return weight + speed; } void listen(const Horse &h) { h.speak(); } int main() { Deer d(40,60); //这是一头鹿, d.speak(); //我是如假包换的鹿 listen(d); //指鹿为马,听到鹿说的却是: //吾本千里马也!体重:40kg,奔跑时速:60km/h // 更糟糕的是,一头鹿还可以变成int int n = d+10; //40+60+10 = 110 cout<<n<<endl; return 0; }
operator Horse()和operator int()都为类Deer的成员函数,对强制转换运算符(Horse类的强制转换和int类型的强制转换)进行了重载。
使Deer类的对象能够被强制转化为Horse对象和int类型。
两个隐含转换:
1.在函数void listen()中将传进去的Deer对象隐含的转化为Horse对象,调用了Horse对象的speak()函数,所以听到的是马说的话。
2.n = d+10;这一句将Deer的对象d隐含转化为int类型并参与运算。
测试:
1.显式调用重载函数,在main函数里面加上如下语句,输出结果注释在后面
d.operator Horse().speak(); //吾本千里马也!体重:40kg,奔跑时速:60km/h
d.operator int();//输出100
cout<<d<<endl;
说明:
1.转换运算符的重载方式比较特别,方法如下:operator 类名();
转换运算符的重载函数是没有返回类型的,它和类的构造函数,析构函数一样是不遵循函数有返回类型的规定的,他们都没有返回值。
2.定义转换函数时应注意如下几点:
(1)转换函数是用户定义的成员函数,但它要是非静态的。
(2)转换函数的不可以有返回值。(意思是声明中不可以有返回值)
(3)转换函数也不带任何参数。
(4)转换函数函数还不能定义为友元函数。
转换函数的名称是类型转换的目标类型,因此,不必再为它指定返回值类型;转换函数是被用于本类型的数值或变量转换为其他的类型,也不必带参数。
类中的构造函数完成其他类型到类类型的转换,而重载强制转换完成类类型到其他类型的转换。
相关文章推荐
- 展示编写的一个有趣C程序
- 一个有趣的自动刷新程序
- 一个有趣的小程序:给应用程序套个马甲
- & 运算符重载以后 一个有趣的程序
- 关于javascript程序内存占用的一个有趣的实验
- 一个有趣的.net程序死锁问题
- win32只创建一个对话框的程序(很有趣)
- Android 一个有趣的小程序!!!看你能有多短!!!
- 一个控制电脑关机的有趣程序
- java程序实现一个有趣的买啤酒问题
- 一个有趣的小程序,很有启发
- 一个有趣的.net程序死锁问题
- 类与接口的一个有趣程序例子
- 一个有趣的程序,java的引用传参。
- 一个简单有趣的C语言自打印程序print-me.c
- c语言:编辑一个有趣的死循环程序并对其修改,仅仅是一个“=”号的差别
- 我用PHP图像技术做了一个有趣的贴胡子程序,准确率达到98%
- 推荐一个有趣的Chrome扩展程序-查看任意网站的开发技术栈
- C++运算符重载小程序