我的教授要求我查找C++中的哪些运算符无法重载,原因是什么。我发现点(。),范围解析(::),条件(?:),sizeof()运算符不能重载。任何人都可以告诉我为什么?关于运算符重载
关于运算符重载
回答
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++委员会的成员,不是标准功能提案的粉丝,或者根本就不在乎,因为他没有需要这个功能。
但我们可以重载 - >操作符用于smiler目的。为什么? – 2014-10-08 14:48:10
@AbhijithPHaridas'operator->'由'operator *'然后'operator.'组成,当你重载'operator->'时,你只会重载'operator *'的一部分,实际上你必须返回一个指针编译器将取消引用,然后使用它自己的本地和'operator'的神圣强大的实现。请参阅http://stackoverflow.com/q/4421706/1147772。 – Drax 2014-10-08 14:50:50
- 1. 关于运算符重载决策
- 2. 关于C++运算符重载
- 3. 关于运算符重载在C++
- 4. 运算符重载 - 重载*
- 5. 重载运算符*
- 6. 重载运算符%
- 7. 重载++运算符
- 8. 重载+ =运算符
- 9. 运算符重载?
- 10. 重载运算符[]
- 11. 重载运算符=
- 12. 重载=运算符
- 13. 运算符重载(=)
- 14. 运算符重载
- 15. 重载运算符+
- 16. 运算符重载+ =
- 17. C++运算符重载利用关联
- 18. 重载模板关系运算符
- 19. 有关在运算符重载定义
- 20. 重载“设置为等于”运算符
- 21. C++运算符在已重载的运算符中重载
- 22. 运算符重载“运算符T *()”产生比较运算符?
- 23. 关于重载运算符的问题<<
- 24. 关于Python中运算符重载的查询
- 25. 如何重载运算符[] []
- 26. C++运算符重载==
- 27. 重载乘法运算符
- 28. 重载多个运算符
- 29. 重载运算符类型
- 30. 重载运算符'='和'+'
http://www.stroustrup.com/bs_faq2.html#overload-dot – 2014-10-08 14:05:42
昨天我浏览了stroustrup的网站。该网站的解释太难理解了。如果你可以更简单地解释它,请做它 – 2014-10-08 14:09:09
他是C++的创造者,为什么你不想直接从马的嘴里得到答案? – CoryKramer 2014-10-08 14:10:23