已经重载的运算符<<,>>,=等多次使用。
我想到的一个例子就是当我们添加字符串时说:
string name = string(“munish”)+“kumar”;
+运算符在字符串类中重载。
但是当我们添加像1 + 2这样的数字时(似乎不像是重载的操作员调用)
我只是想知道编译器是如何进行二进制加法的。
如果编译器这么做的话,我不需要担心它,只是好奇的问题。
答案 0 :(得分:7)
原始类型不实现operator+
,它实际上是一个具有奇怪名称的函数。原始类型的添加由CPU指令执行,如:
addl %edx,(%eax) //this adds two integral values loaded at edx and eax
为用户定义的类型实现operator+
,编译器会生成大量CPU指令来执行您在operator+
中编写的任务。
答案 1 :(得分:2)
我认为你混淆了两件事:运营商重载,以及你如何
为用户定义的类型定义运算符。运算符重载不是
新;它已存在于C中,其中+
在int
,unsigned
int
,long
,unsigned long
,float
,double
上重载和long double
。在
C ++,您可以通过定义a来为用户定义的类型添加运算符
函数名为operator+
,因此重载列表更长。并
使事情更加连贯,编译器解决重载的方式是
沿operator+(int, int)
行添加合成签名
到重载列表。如果过载分辨率最终结束
选择其中一个合成签名,它使用内置的
运算符,生成任何必要的机器代码(可能
涉及机器代码级别的函数调用)。它的事实
选择其中一个“内置”重载确实会产生反响
其余代码:用户定义的运算符被视为函数调用,
与相应的序列点和所有其余的,以及
编译器不允许对其进行任何假设
语义 - 特别是编译器不能假设用户
定义的operator+
是关联的或可交换的。内置运算符
(除了极少数例外)不会引入任何序列点,并且
编译器知道它的语义,因此可以进行优化。
请注意,生成的机器代码可能没有那么不同。我有
用过的机器,编译器必须调用一个函数来乘法
int
,编译器可以(通常会)内联用户定义的内容
运营商。我上面提到的规则有什么变化:存在
用户定义的运算符中的序列点,以及事实
编译器不能对各种数学做出假设
可能适用的法律。
答案 2 :(得分:1)
你可以在自定义数据类型上重载运算符,即类.. int是原始数据类型,原始类型的运算符由编译器本身实现,基本上它只是一个简单的CPU指令来添加int等