能够超载是非常有用的。 C ++中的operator并返回对象的引用。
您可以重载operator->
和operator*
,但不能重载operator.
这有技术原因吗?
答案 0 :(得分:60)
请参阅this quote from Bjarne 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? }
这个问题可以通过几种方式解决。在那个时间 标准化,哪种方式最好是不明显的。更多 详情请参阅The Design and Evolution of C++。
答案 1 :(得分:50)
Stroustrup说C ++应该是一种可扩展但不可变的语言。
点(属性访问)运算符被认为太靠近语言的核心以允许重载。
请参阅The Design and Evolution of C++,第242页, 11.5.2智能参考部分。
当我决定允许重载运算符
->
时,我自然会考虑运算符.
是否可以同样重载。当时,我认为以下论点是结论性的:如果
obj
是一个类对象,那么obj.m
对该对象类的每个成员m
都有意义。我们尝试不通过重新定义内置操作来使语言变得可变(尽管=
出于迫切需要违反了该规则,并且对于一元&
)。如果我们允许为
.
课程重载X
,我们将无法通过正常方式访问X
的成员;我们必须使用指针和->
,但->
和&
也可能已经重新定义。我想要一种可扩展的语言,而不是一种可变语言。这些论点很重要,但不是决定性的。特别是在1990年,Jim Adcock建议允许运算符
.
完全重载运算符->
。
这句话中的“我”是Bjarne Stroustrup。你不能比那更具权威性。
如果你想真正理解C ++(就像“为什么会这样”),你绝对应该阅读这本书。
答案 2 :(得分:29)
Stroustrup has an answer for this question:
运营商。 (点)原则上可以 使用相同的技术重载 用于 - >。但是,这样做可以 引出有关是否的问题 操作是针对该对象的 超载。或提到的对象 通过。例如:
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。
答案 3 :(得分:1)
如果你通过运算符函数调用的内部机制,很容易理解, 假设一个类复合体可以有两个成员r用于实部,而i用于虚部。 说复杂C1(10,20),C2(10,2) //我们假设在类中已经有一个两个参数构造函数。 现在,如果您将 C1 + C2 写为语句,则编译器会尝试在复数上找到+运算符的重载版本。现在我们假设我重载+运算符,所以 C1 + C2 内部翻译为 c1.operator +(c2) 现在假设你可以超载'。'。运营商。 所以现在想想调用 C1.disp() //显示复杂对象的内容现在尝试表示为内部表示 C1.operator。(------),创造了完全凌乱的东西。这就是为什么我们不能超载'。'运营商