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

能够超载的将是非常有用的。 运算符在C ++中,并返回一个对象的引用。

你可以重载operator->operator*而不是operator.

有这个技术原因吗?

看到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) { xf(); // X::f or Y::f or error? } 

这个问题可以用几种方法解决。 在标准化的时候,哪一种方法最好还不是很明显。 有关更多详细信息,请参阅C ++的devise和演变 。

Stroustrup说C ++应该是一个可扩展但不可变的语言。

点(属性访问)运算符被认为是太接近语言的核心,以允许超载。

请参阅C ++的devise和演变 ,第242页,第11.5.2节“ 智能参考”

当我决定允许operator ->重载时,我自然会考虑是否operator . 可能类似地被重载。

当时,我认为以下论点是有obj.m :如果obj是一个类对象,那么obj.m对该对象的类的每个成员m都有一个含义。 我们尽量不要通过重新定义内置操作来使语言变得可变(尽pipe违反这个规则是因为急需,而且是一元的)。

如果我们允许超载的话. 对于X类,我们将无法通过正常方式访问X的成员; 我们将不得不使用一个指针和-> ,但是-> &也可能已经被重新定义。 我想要一个可扩展的语言,而不是一个可变的语言。

这些论点是重要的,但不是结论性的。 特别是在1990年,Jim Adcock提出允许运营商超载. 正是运营商->方式。

这个引用中的“I”是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) { xf(); // X::f or Y::f or error? } 

这个问题可以用几种方法解决。 在标准化的时候,哪一种方法最好还不是很明显。 有关更多详细信息,请参阅D&E 。

很容易理解,如果你通过运算符函数调用的内部机制,说一个类复合体可以有两个成员r为实部,i为虚部。 说复杂的C1(10,20),C2(10,2) //我们假设在类中已经有一个两个参数的构造函数。 现在,如果您将C1 + C2作为语句编译,那么编译器会尝试在复数上查找+运算符的重载版本。 现在我们假设我是超载+运算符,所以C1 + C2内部翻译为c1.operator +(c2)现在假设你可以超载'。 运营商。 所以现在想下面调用C1.disp() //显示一个复杂对象的内容现在尝试用C1.operator。(——)的内部表示来表示,完全凌乱的东西创build。 这就是我们不能超载的原因。 操作者