C++运算符重载之指鹿为马(类型转换)

软件和网站开发以及相关技术探讨
回复
xyath
帖子: 4
注册时间: 2009-11-09 10:39

C++运算符重载之指鹿为马(类型转换)

#1

帖子 xyath » 2009-11-09 18:24

C++运算符重载之指鹿为马(类型转换)

帖子由 tiger » 2009-08-14 21:13
C++的运算符重载是这个语言的一个非常强大的表现力一个方面,运算符重载中有几个比较独特的行为,如:函数对象、类型转换等,这里简单的写几行代码(类型转换),把一头鹿变为一匹马 :lol: :lol:

代码: 全选
/*
* type_conv.cpp
*
* Created on: 2009-8-14
* Author: kwarph
* Mail: kwarph@gmail.com
*/
#include <iostream>

using namespace std;

class Horse {
public:
Horse() :
weight(0), speed(0), teeth(0) {
}

Horse(const int& w, const int& s, const int& t = 0) :
weight(w), speed(s), teeth(t) {
}

void neigh() const {
cout << "吾本千里马也! " << "体重: " << weight << ", 奔跑时速: " << speed << endl;
}

// 其它成员函数略 ...

private:
int weight;
int speed;
int teeth;

// 其它成员变量略 ...

};

class Deer {
public:
Deer() :
weight(0), speed(0) {
}

Deer(const int& w, const int& s) :
weight(w), speed(s) {
}

operator Horse() const {
return Horse(weight, speed);
}

operator int() const {
return weight + speed;
}

void speak() const {
cout << "我是如假包换的鹿" << endl;
}

// 其它成员函数略 ...

private:
int weight;
int speed;

// 其它成员变量略 ...

};

void listen(const Horse& h) {
h.neigh();
}

int main() {
Deer d(40, 68); // 这是一头鹿,40kg体重,时速68公里的奔跑速度
d.speak(); // 不信听他说的:我是如假包换的鹿

listen(d); // 可是在这里,鹿却变成了马,听他的嘶鸣:
// 吾本千里马也! 体重: 40, 奔跑时速: 68

// 更糟糕的是,一头鹿还可以变成int,不然他怎么会与int为伍?整个一部《哈利波特》
int n = 12 + d; // 12 + 40 + 68 = 120
cout << n << endl; // 120
}

Linux C++高级软件工程师训练营
Q Q: 570508473
主 页:http://www.xuanyuan-soft.cn
论 坛:http://www.xuanyuan-soft.cn/forums
andrew72
帖子: 46
注册时间: 2009-08-07 20:55
来自: 中国-北京

Re: C++运算符重载之指鹿为马(类型转换)

#2

帖子 andrew72 » 2009-11-16 22:10

再次证明, 改用C吧, C++太过于"复杂"了
路漫漫其修远兮, 吾将上下而求索
头像
zhu527812567
帖子: 883
注册时间: 2009-11-17 12:29
联系:

Re: C++运算符重载之指鹿为马(类型转换)

#3

帖子 zhu527812567 » 2009-11-18 17:03

代码: 全选

class Deer {
public:

operator Horse() const {
return Horse(weight, speed);
}

operator int() const {
return weight + speed;
}
LZ观念错了咯,listen(d)过程中发生的所谓鹿转换为马
其实是根据原来的鹿制造一个临时的马,这个临时的马当然可以listen...

+ d 的时候编译器 先通过这个转换制造一个临时的int。。再参与运算。。

所以根本不存在鹿变马这回事
poet
帖子: 2841
注册时间: 2006-09-11 22:47

Re: C++运算符重载之指鹿为马(类型转换)

#4

帖子 poet » 2009-11-20 9:42

类型转换操作符在几乎所有正规的C++教材中都会建议你尽量避免使用。

多的我不说了。
回复