为什么你不能超载'。' C ++中的运算符?

时间:2009-02-06 11:54:02

标签: c++ operator-overloading

能够超载是非常有用的。 C ++中的operator并返回对象的引用。

您可以重载operator->operator*,但不能重载operator.

这有技术原因吗?

4 个答案:

答案 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。(------),创造了完全凌乱的东西。这就是为什么我们不能超载'。'运营商

相关问题