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