原始类型的+运算符是否重载?

时间:2011-06-02 06:54:05

标签: c++ operator-overloading

已经重载的运算符<<,>>,=等多次使用。

我想到的一个例子就是当我们添加字符串时说:

  

string name = string(“munish”)+“kumar”;

+运算符在字符串类中重载。

但是当我们添加像1 + 2这样的数字时(似乎不像是重载的操作员调用)

我只是想知道编译器是如何进行二进制加法的。

如果编译器这么做的话,我不需要担心它,只是好奇的问题。

3 个答案:

答案 0 :(得分:7)

原始类型不实现operator+,它实际上是一个具有奇怪名称的函数。原始类型的添加由CPU指令执行,如:

addl %edx,(%eax) //this adds two integral values loaded at edx and eax

为用户定义的类型实现operator+,编译器会生成大量CPU指令来执行您在operator+中编写的任务。

答案 1 :(得分:2)

我认为你混淆了两件事:运营商重载,以及你如何 为用户定义的类型定义运算符。运算符重载不是 新;它已存在于C中,其中+intunsigned intlongunsigned longfloatdouble上重载和long double。在 C ++,您可以通过定义a来为用户定义的类型添加运算符 函数名为operator+,因此重载列表更长。并 使事情更加连贯,编译器解决重载的方式是 沿operator+(int, int)行添加合成签名 到重载列​​表。如果过载分辨率最终结束 选择其中一个合成签名,它使用内置的 运算符,生成任何必要的机器代码(可能 涉及机器代码级别的函数调用)。它的事实 选择其中一个“内置”重载确实会产生反响 其余代码:用户定义的运算符被视为函数调用, 与相应的序列点和所有其余的,以及 编译器不允许对其进行任何假设 语义 - 特别是编译器不能假设用户 定义的operator+是关联的或可交换的。内置运算符 (除了极少数例外)不会引入任何序列点,并且 编译器知道它的语义,因此可以进行优化。

请注意,生成的机器代码可能没有那么不同。我有 用过的机器,编译器必须调用一个函数来乘法 int,编译器可以(通常会)内联用户定义的内容 运营商。我上面提到的规则有什么变化:存在 用户定义的运算符中的序列点,以及事实 编译器不能对各种数学做出假设 可能适用的法律。

答案 2 :(得分:1)

你可以在自定义数据类型上重载运算符,即类.. int是原始数据类型,原始类型的运算符由编译器本身实现,基本上它只是一个简单的CPU指令来添加int等