C++ 为什么可以';在C+中,不是所有的东西都会过载吗+;?

C++ 为什么可以';在C+中,不是所有的东西都会过载吗+;?,c++,operator-overloading,C++,Operator Overloading,sizeof和typeid不能超载是合理的,但我看不出超载的危害:、*和。有技术原因吗?如果您超载,您将如何访问类成员?对象数据的含义是什么?语法是什么 事实上,有充分的理由不重载任何操作符 它不会计算所有的操作数:不应该 过载和/或| |其中之一(特殊情况除外)。你不能 使用重载运算符模拟此操作。考虑某事 比如: p!=无效的defaultValue:p->getValue() 其中,defaultValue或p->getValue()的类型会导致重载 决心收拾你的超负荷。这是一个常见的成语,

sizeof
typeid
不能超载是合理的,但我看不出超载的危害:、
*
。有技术原因吗?

如果您超载
,您将如何访问类成员?
对象数据的含义是什么?

语法是什么

事实上,有充分的理由不重载任何操作符 它不会计算所有的操作数:不应该 过载和/或| |其中之一(特殊情况除外)。你不能 使用重载运算符模拟此操作。考虑某事 比如: p!=无效的defaultValue:p->getValue() 其中,defaultValue或p->getValue()的类型会导致重载 决心收拾你的超负荷。这是一个常见的成语,但是
如果你超负荷工作,它就不能工作了?:。

这里有一些阅读材料:)

一般来说,重载上述操作符没有任何好处。您将尝试实现哪些附加语义

重载运算符的原因是为类的用户提供直观的语法。例如,为字符串重载+和+=是有意义的。对于另一个开发者来说,这意味着什么是显而易见的

真的不太清楚你会超负荷什么?:因为。。。也就是说,据我所知,没有任何技术原因阻止这些运营商超载

重载->操作符允许创建引用计数指针,如boost::shared\u ptr。“否定”一个对象的概念在不同的上下文中可能有不同的含义,因此偶尔重载此运算符是合理的。

定义“运算符布尔”就足以使?:工作。 接线员。想想这个:SomeClass.“SomeString!!”


这些重载禁止编译器的lexer正确解析文件。

可以重载大多数运算符的原因是能够模拟内置类型。由于没有内置类型可以使用
操作符,因此它没有任何用途
operator*
operator->
在这里,您可以创建自己的指针类。所有的数学和布尔运算符都可以用来创建自己的数值类。

引用比亚恩·斯特劳斯图普的话:

没有根本理由这样做 不允许重载?:。我只是 没有必要介绍 三元函数重载的特例 操作人员请注意,函数 重载expr1?expr2:expr3将 不能保证只有一个 已执行expr2和expr3的

接线员。(dot)原则上可以是 使用与相同的技术重载 用于->。然而,这样做可能会造成严重后果 引出关于 操作是针对对象的 重载
或引用的对象 通过
。。。这个问题可以在短期内解决 有几种方法。在 标准化,不明显 哪条路最好



其危害在于,操作员过载已经使得确定从程序中提取的一行代码的含义变得困难;特别是允许
重载将是一种讽刺。相反,允许这样做有什么好处?请原谅我的无知,
*
真的是一个操作员还是一个打字错误?@Tomalak:你说得对,可读性和可定制性之间存在着权衡。我在寻找一个原因,
不能被重载,而
->
可以和
可以--看起来很随意。@ereOn:这是指向成员取消引用运算符(直接)的指针。”。还有一个间接版本,
->*
。我需要范围运算符
。还有一匹小马。但是
->
仍然可以,那么
obj->data
的意思又是什么呢?@TommyA:没错。如果同时重载(
->
),则无法真正访问类成员。既然一个已经被允许了,那么拒绝另一个是有意义的,并且避免了很多问题@TommyA:它允许智能指针对象感觉像真实(原始)指针。请注意,
->
是一个非常特殊的情况。它是一个二进制运算符,但在重载期间只使用左侧。它是锁链。在计算之后,名称解析在右侧进行。所有这些都是独特的行为。
->
更基本
obj->data
被定义为
(*obj)。data
,因此重载它基本上等同于重载解引用运算符。@TommyA:有一个细微但显著的区别。当obj为T*时,其含义与(*obj).data相同,并且不能重载->运算符。有趣的情况是当obj是T时-在这种情况下,您是“重载”->,没有默认的实现。重载
?:
以缩短,例如
播放器。is_dead()?…:
money.value==0?…:@Ben:谢谢,我没听说过。@Tim Nordenfur-那会导致意想不到的行为。实现重载的
?:
运算符的函数将无法保证只执行“true”或“false”分支。请参阅我的答案中比亚恩的引用。第二个示例money.value==0更像重载==而不是…?:。。。。还有,好吧,你可以重载==,所以这个例子不是这里的情况。@bta:当然会有限制,就像重载
&&
一样。很高兴看到为什么斯特劳斯特鲁普先生直接这么说!第二句话基本上是说,如果你有
a.b
,并且
a
的类型重载了
运算符。
,那么很难确定
b
是应用于实例
a
,还是应用于
类型::运算符的结果。(a)
(我正在使用函数syn