C++的*运算符已经被重载了吗?

9
我的C++老师认为,在标准的C++中,*运算符已经被“重载”了,因为它可以根据上下文意义表示间接寻址或乘法。他从《C++ Primer Plus》这本书中得到了这个观点,该书指出:
实际上,许多C++(和C)运算符已经被重载了。例如,当将*运算符应用于地址时,会产生存储在该地址处的值。但是,将*应用于两个数字会产生这些值的乘积。C++使用操作数的数量和类型来决定采取哪种操作。(第5版502页)
至少还有一本教材说了同样的话。就我所知,这不是真的;一元的*与二元的*是不同的运算符,编译器消除歧义的机制与运算符重载无关。
谁是正确的?

3
你是对的。从某种意义上讲,可以说内置运算符根据它们的参数已经具备了多态性。这就是静态多态性。 - sehe
7
注意,除了存在两个 * 运算符(这是英语意义上的“重载”,但不是 C++ 的重载),内置二元 * 运算符实际上在 C++ 意义上也是重载的,因为它适用于不同类型的 intdouble 等,具有不同的效果。有效重载集合以运算符重载决议目的在标准中定义,位于第13.6/12节。同样,对于每种指针类型(13.6/6)和函数指针类型(/7),一元 * 也被有效地重载了。 - Steve Jessop
3个回答

12

两种观点都是正确的,因为问题取决于上下文和“overloading”一词的含义。

“Overloading”可以通俗地解释为“相同的符号有不同的含义”,并且允许包括间接和乘法在内以及任何用户定义的行为在内的所有使用星号“*”的情况。

“Overloading”也可以用于应用于C++的正式运算符重载功能,此时间接运算符和乘法运算符确实是不同的。

补充说明:请参见Steve在下面的评论中对“运算符重载”与“token overloading”的讨论。


16
即使是“overloading”这个术语本身也有重载的含义。 - Oliver Charlesworth
7
准确来说,我认为前者的意思是 * 标记被重载了,而不是 * 运算符。虽然这是一个微小的差别,但是我之所以说是标记,是因为使用一元 * 的表达式的语法与使用二元 * 的表达式的语法不同。你可以想象它们都被转换为 operator*(...),一元 * 对应一个参数,二元 * 对应两个参数,在这种情况下,它就像一个名为 operator* 的重载函数。但这并不完全符合标准对算术表达式的定义。 - Steve Jessop
1
@Steve 我完全同意并喜欢那种精确度。我会选择那个答案而不是我的。 :) - Ray Toal

2

我相信你是正确的。解引用操作符和乘法操作符是不同的运算符,即使它们写起来一样。加号、减号、自增、自减以及其他可能被遗忘的操作符也是如此。

我认为在这段文字中,“overloaded”一词是指“以多种方式使用”,但并非由用户完成。因此,您也可以认为该书是正确的……这还取决于您是指指针的*重载操作符还是乘法操作符的重载(例如)。


1

从某种意义上说,它是过载的,因为同一个字符在不同的地方有不同的含义(例如指针解引用、int之间的乘法、与其他内置类型的乘法等)。

一般来说,“运算符重载”是指使用自定义代码定义一个运算符(具有与内置运算符相同的符号),以便它对用户定义的类型执行有趣的操作。

所以... 你们两个都是对的 :-)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接