能够在C++中重载 . 运算符并返回对象的引用将非常有用。
可以重载 operator->
和 operator*
,但不能重载 operator.
。
这是由于技术原因吗?
能够在C++中重载 . 运算符并返回对象的引用将非常有用。
可以重载 operator->
和 operator*
,但不能重载 operator.
。
这是由于技术原因吗?
运算符"."理论上可以使用与"->"相同的技术进行重载。然而,这样做可能会引发一个问题,即操作是否针对重载"."的对象,还是"."所指代的对象。例如:
class Y { public: void f(); // ... }; class X { // assume that you can overload . Y* p; Y& operator.() { return *p; } void f(); // ... }; void g(X& x) { x.f(); // X::f or Y::f or error? }
这个问题可以用几种方法解决。在标准化时,没有明显的最佳选择。有关更多细节,请参阅C++设计和进化。
operator .
的理由。 - slashmaisoperator.
的正当性是与 operator->
显式并行的。你怎么能进行重载决议呢? - curiousguyStroustrup认为C++应该是一种可扩展但不可变的语言。
点操作符(属性访问)被视为过于接近语言核心,不允许重载。
参见《C++的设计与演化》第242页,第11.5.2智能引用节。
当我决定允许重载运算符
->
时,我自然而然地考虑了是否可以类似地重载运算符.
。当时,我认为以下论点是有说服力的:如果
obj
是一个类对象,则obj.m
对于该对象类的每个成员m
都有意义。我们尽量避免通过重新定义内置操作使语言变得可变(虽然出于迫切需要,这个规则在=
和一元&
时被违反)。如果我们允许对类
X
重载.
,我们将无法通过正常手段访问X
的成员;我们将必须使用指针和->
,但->
和&
也可能已被重新定义。我想要的是一种可扩展的语言,而不是一种可变的语言。这些论点是有分量的,但并非定论。尤其是在1990年,Jim Adcock提议允许完全像重载运算符
->
那样重载运算符.
。
这个引文中的“我”指的是Bjarne Stroustrup本人。没有比这更权威的了。
如果你真的想了解C++(比如“为什么会变成这样”),你应该绝对阅读这本书。
Stroustrup对这个问题有一个回答:
点运算符 . 原则上可以使用与 -> 相同的技术进行重载。然而,这样做可能会引起疑问,即操作是针对重载 . 的对象还是 . 所指代的对象。例如:
class Y { public: void f(); // ... }; class X { // assume that you can overload . Y* p; Y& operator.() { return *p; } void f(); // ... }; void g(X& x) { x.f(); // X::f or Y::f or error? }
这个问题可以用几种方法来解决。在标准化时,哪种方法最好并不明显。有关更多详细信息,请参见D&E。
operator.
- curiousguy
operator.
е’Ңoperator.*
зҡ„иғҪеҠӣпјҢе…¶дёӯеҢ…еҗ«дёҖдәӣзӨәдҫӢгҖӮ - Mankarse