当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 4 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : C++运算符重载之指鹿为马(类型转换)
帖子发表于 : 2009-11-09 18:24 

注册: 2009-11-09 10:39
帖子: 4
送出感谢: 0 次
接收感谢: 0 次
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


页首
 用户资料  
 
2 楼 
 文章标题 : Re: C++运算符重载之指鹿为马(类型转换)
帖子发表于 : 2009-11-16 22:10 

注册: 2009-08-07 20:55
帖子: 47
地址: 中国-北京
送出感谢: 0 次
接收感谢: 0 次
再次证明, 改用C吧, C++太过于"复杂"了


_________________
路漫漫其修远兮, 吾将上下而求索


页首
 用户资料  
 
3 楼 
 文章标题 : Re: C++运算符重载之指鹿为马(类型转换)
帖子发表于 : 2009-11-18 17:03 
头像

注册: 2009-11-17 12:29
帖子: 883
送出感谢: 0 次
接收感谢: 0 次
代码:
class Deer {
public:

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

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


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

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

所以根本不存在鹿变马这回事


页首
 用户资料  
 
4 楼 
 文章标题 : Re: C++运算符重载之指鹿为马(类型转换)
帖子发表于 : 2009-11-20 9:42 

注册: 2006-09-11 22:47
帖子: 2841
送出感谢: 0 次
接收感谢: 4
类型转换操作符在几乎所有正规的C++教材中都会建议你尽量避免使用。

多的我不说了。


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 4 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 4 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译