为基元类型重载了Is+运算符

Is + operator overloaded for primitive types?

本文关键字:Is+ 运算符 重载 类型      更新时间:2023-10-16

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

我想到的一个例子是,当我们添加字符串时,比如:

string name=string("munish")+"kumar";

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

但当我们加上1+2这样的数字时(看起来不像是过载的接线员呼叫)

我只是想知道编译器是怎么做二进制插件的。

不过,如果编译器这样做,我不需要太担心,只是出于好奇。

Primitive类型不实现operator+,它实际上是一个名称怪异的函数。图元类型的添加由CPU指令执行,例如:

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

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

我认为您混淆了两件事:运算符重载和如何为用户定义的类型定义运算符。操作员过载不是新它已经存在于C中,其中+intunsigned intlongunsigned longfloatdoublelong double上过载。在里面C++,您可以为用户定义的类型添加运算符,方法是定义函数名为operator+,因此重载列表更长。和使事情更加连贯,编译器解决重载的方式是沿着operator+(int, int)的行添加合成签名添加到重载列表中。如果过载解决方案结束选择这些合成签名中的一个,它使用内置的操作员,生成任何必要的机器代码(可能涉及机器代码级别的函数调用)。事实上选择一个"内置"重载确实会在代码的其余部分:用户定义的运算符被视为函数调用,具有相应的序列点和所有其他序列点,以及编译器不允许对其语义—特别是,编译器不能假定用户定义的CCD_ 14是结合的或交换的。内置运算符(除了极少数例外)没有引入任何序列点,并且编译器知道它的语义,因此可以进行优化。

请注意,生成的机器代码可能没有那么不同。我已经使用编译器必须调用函数进行乘法运算的机器int s,并且编译器可以(并且经常)内联用户定义的操作人员我上面提到的规则发生了什么变化:用户定义运算符中的序列点,以及编译器不能对各种数学问题做出假设可能适用的法律。

您可以在自定义数据类型(即类)上重载运算符。。int是一个基元数据类型,基元类型上的运算符由编译器自己实现,基本上它只是一个简单的CPU指令来添加int etc