2014-10-08 73 views
-9

我的教授要求我查找C++中的哪些运算符无法重载,原因是什么。我发现点(。),范围解析(::),条件(?:),sizeof()运算符不能重载。任何人都可以告诉我为什么?关于运算符重载

+5

http://www.stroustrup.com/bs_faq2.html#overload-dot – 2014-10-08 14:05:42

+0

昨天我浏览了stroustrup的网站。该网站的解释太难理解了。如果你可以更简单地解释它,请做它 – 2014-10-08 14:09:09

+0

他是C++的创造者,为什么你不想直接从马的嘴里得到答案? – CoryKramer 2014-10-08 14:10:23

回答

0
struct Troll 
{ 
    int money = 0; 
    int problems = 0; 
    float cant_touch_this = 0.0; 

    int& operator.(const std::string& member_name) 
    { 
    if (member_name == "money") 
     return problems; 
    else if (member_name == "problems") 
     return money; 
    else if (member_name == "cant_touch_this") 
     throw cant_touch_this; 
    else 
     throw 0; 
    } 
}; 

int main() 
{ 
Troll t; 

t.money = 42; 
t.problems = 3; 
} 

在写上面的代码中那肯定不能编译,我问自己多个问题:

  • 我应该operator.返回类型是什么?
  • 需要使用哪个参数?
  • 我如何处理我抛出的情况?
  • 为什么我需要运行时间开销来评估编译时成员?
  • 其他开发者可以通过切换我的成员来适应我吗?
  • 这份名单可以继续下去...

这是尽可能多的原因,为什么你不能超载点(。)运算符,并有你会问自己类似的问题,试图超载非可重载的操作员。

一个聪明的头脑可能会找到这些问题的不错答案,但是这个头脑要么还没有诞生,还不是C++委员会的成员,不是标准功能提案的粉丝,或者根本就不在乎,因为他没有需要这个功能。

+0

但我们可以重载 - >操作符用于smiler目的。为什么? – 2014-10-08 14:48:10

+0

@AbhijithPHaridas'operator->'由'operator *'然后'operator.'组成,当你重载'operator->'时,你只会重载'operator *'的一部分,实际上你必须返回一个指针编译器将取消引用,然后使用它自己的本地和'operator'的神圣强大的实现。请参阅http://stackoverflow.com/q/4421706/1147772。 – Drax 2014-10-08 14:50:50