sizeof
和typeid
无法重载是合理的,但我无法看到重载?:
,.*
和.
的危害。这有技术原因吗?
答案 0 :(得分:16)
引用Bjarne Stroustrup:
没有根本原因 不允许超载?:。我只是 没看到有必要介绍一下 超载三元的特例 运营商。注意一个功能 重载expr1?expr2:expr3会 不能保证只有一个 执行了expr2和expr3。
...
运营商。 (点)原则上可以 使用相同的技术重载 用于 - >。但是,这样做可以 引出有关是否的问题 操作是针对该对象的 重载
.
或引用的对象 通过.
...这个问题可以解决 几种方式。在那个时间 标准化,并不明显 哪种方式最好。
答案 1 :(得分:7)
如果你重载.
,你会如何访问班级成员? obj.data
的含义是什么?
答案 2 :(得分:3)
语法是什么?
事实上,有充分的理由不重载任何运营商 它没有评估它的所有操作数:你不应该 过载&&或|| (特殊情况除外)。你不能 用重载运算符模拟这个。考虑一下 喜欢: p!= NULL? defaultValue:p-> getValue() 其中defaultValue或p-> getValue()的类型导致重载 解决你的超载问题。这是一个常见的习语,但是 如果超载,它就无法工作?:。
答案 3 :(得分:0)
以下是一些阅读材料C++ FAQ Lite:)
一般来说,重载上面的运算符没有任何好处。你想要实现哪些额外的语义?
重载运算符的原因是为类的用户提供直观的语法。例如,对字符串重载+和+ =是有意义的。对于另一位开发人员来说,这意味着什么。
你真的不明白你会超载的是什么?:for ...那就是说我没有任何技术原因可以防止这些操作员过载。
重载 - >运算符允许创建引用计数指针,例如boost :: shared_ptr。 “否定”一个对象的概念在不同的上下文中可能有不同的含义,因此偶尔重载该运算符是合理的。
答案 4 :(得分:0)
定义“operator bool”就足够了?:工作。 对于运营商。想到这个:SomeClass。“SomeString !!”
这些重载禁止编译器的词法分析器正确解析文件。
答案 5 :(得分:0)
您可以重载大多数操作符的原因是能够模拟内置类型。由于没有任何内置类型可以使用.
运算符,因此它不会用于任何目的。 operator*
和operator->
就在那里,所以你可以创建自己的指针类。所有的数学和布尔运算符都可以创建自己的数字类。