是时候祭出大杀器了,出自 http://coolshell.cn/articles/1724.html
请看下面这段代码,你能告诉我它会输出什么吗?
#include <iostream>
#include <vector>
typedef int UINT4;
using namespace std;
class Hack
{
};
Hack& operator< (Hack &a , Hack &b)
{
std::cerr << "小于操作符\n";
return a;
}
Hack& operator> (Hack &a, Hack &b)
{
std::cerr << "大于操作符\n";
return a;
}
int main(int argc, char ** argv)
{
Hack vector;
Hack UINT4;
Hack foo;
vector<UINT4> foo;
}
1
mackyzhan 2015-01-07 19:09:34 +08:00 via Android
main函数int类型没返回值,最起码return个0吧?
|
2
abcdabcd987 OP @mackyzhan 这个是 C++ ,不是 C
|
3
ispinfx 2015-01-07 19:39:10 +08:00 via iPhone
@abcdabcd987 不是c++才要返回吗
|
4
sumhat 2015-01-07 19:50:09 +08:00
这和 #define TRUE FALSE 本质上是一样的
|
5
likebeta 2015-01-07 19:51:31 +08:00
看起来很厉害
|
6
auser 2015-01-07 20:01:05 +08:00 1
@mackyzhan @abcdabcd987 @ispinfx
对于C++ 没有的话默认返回0 C99标准里Program termination一节有这么一段: reaching the } that terminates the main function returns a value of 0 |
7
BGLL 2015-01-07 20:06:35 +08:00
小于操作符
大于操作符 |
8
BGLL 2015-01-07 20:09:05 +08:00
障眼法,重新定义操作符太明显了,还不如昨天那个C语言奇技淫巧的-->
|
9
abcdabcd987 OP |
10
BGLL 2015-01-07 20:35:34 +08:00
@abcdabcd987
这个摆明了重新定义了vector、<、>,看到这就能猜到要弄个vector<>出来,太赤果果了。 --> 那个还煞有介事的说出个“趋向于”、“快速趋向于”来迷惑人,一般人一看会先去想:“还有个趋向于运算符?怎么从没听过?”然后开始回忆去了...... |
11
abcdabcd987 OP @BGLL
说实话,看到 --> 的那个帖子,我看到“趋向于”感到很好奇,然后看到代码后立马就笑喷了,是毫不迟疑地笑喷了,几乎没有反应时间。 但是这个,我确实要仔细想一想 vector<UINT4> foo 这句话具体是怎么执行的,想想为什么 vector 和 UINT4 并不是代表 std::vector 和 int 。加上我这种第一眼自动忽略变量定义的习惯,确实需要反应一段时间。 我正是觉得,这个例子并不那么容易看出来,所以就偷懒没有语言加工了(事实上,那句话还是直接从原文抄下来的,懒到没药救了)。我感觉,如果 --> 那篇帖子,没有用一些诱导性的语句的话,并没有什么特别之处。 |
12
hxtheone 2015-01-08 10:22:42 +08:00
操作符重载?
|
13
abcdabcd987 OP @hxtheone 是的
|
14
vinceguo 2015-01-08 13:34:24 +08:00
关于运算符重载,除非重载后意思很明白而且能带来极大方便,否则能不用就不要用。它们本质上就是函数调用而已。观点来自《thinking in c++》
|
15
faywong8888 2015-01-08 19:51:54 +08:00
这个题比较好玩。
|
16
gdgoldlion 2015-01-08 22:03:48 +08:00
@vinceguo 运算符重载的最大问题是,数学本身研究的问题很多,公式运算优先级比较复杂,很难找到一种方式能让运算符很好的对应,比如叉乘到底应该不应该重载运算符的问题。
|