能够超载它是非常有用的.C++中的operator并返回对象的引用.
你可以超载operator->
,operator*
但不能operator.
这有技术原因吗?
请参阅Bjarne Stroustrup的这句话:
运营商.(dot)原则上可以使用与 - >相同的技术重载.但是,这样做会导致对操作是否意味着对象重载的问题.或者提到的对象.例如:
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++的设计和演变.
Stroustrup说C++应该是一种可扩展但不可变的语言.
点(属性访问)运算符被认为太靠近语言的核心以允许重载.
请参阅C++的设计和演变,第242页,第11.5.2节" 智能参考".
当我决定允许运算符重载时
->
,我自然会考虑运算符.
是否同样过载.当时,我认为以下论点是决定性的:如果
obj
是一个类对象,则该对象的obj.m
每个成员都有一个含义m
.我们尽量不通过重新定义内置操作来使语言变得可变(尽管=
出于迫切需要而违反了该规则,并且对于一元而言&
).如果我们允许
.
一个班级超载X
,我们将无法X
通过正常方式访问成员; 我们必须使用指针->
,但->
也&
可能已经重新定义.我想要一种可扩展的语言,而不是一种可变语言.这些论点很重要,但不是决定性的.特别是,1990年,吉姆·阿德科克(Jim Adcock)提议允许操作员
.
完全按照操作员的方式进行超载->
.
这句话中的"我"是Bjarne Stroustrup.你不能比那更具权威性.
如果你想真正理解C++(就像"为什么会这样"),你绝对应该阅读这本书.
Stroustrup 对这个问题有一个答案:
运营商.(dot)原则上可以使用与 - >相同的技术重载.但是,这样做会导致对操作是否意味着对象重载的问题.或者提到的对象.例如:
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.