为什么你不能超载'。 运算符在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。 这就是我们不能超载的原因。 操作者