2011-06-02 53 views
5

已经过载的运营商< <,>>,=等被多次使用。对于原始类型,是否重载了+运算符?

,我在想的一个例子是,当我们添加字符串说:

字符串名称=字符串(“munish”)+“库玛”;

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

但是当我们添加号码,如1 + 2(似乎并不像一个重载的操作员呼叫)

我只是想知道它是如何发生的呢,编译器做一个二进制additon。

我不需要担心,尽管如果编译器这样做,只是对我的好奇心问题。

+0

代码示例错误,两个参数的类型是* N个字符*的数组,它们将衰减为*指向不能添加的字符*。你可能的意思是:'std :: string name = std :: string(“muhish”)+“kumar”;' – 2011-06-02 07:14:36

+0

ahh ...错误...谢谢纠正 – munish 2011-06-02 07:20:26

+1

@David:实际上,阵列不会衰减指针,因为简单地说,数组到指针的衰减只发生在“当编译器很快乐”时。例如,g ++将类型'const char [7]'和'const char [6]'的无效操作数表示为二元运算符+''。请注意,错误消息提到了数组,而不是指针。 – fredoverflow 2011-06-02 09:28:02

回答

7

原始类型不实现operator+这实际上是一个奇怪名称的函数。另外对于基本型是由CPU指令实施,如:

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

您实现operator+为用户定义类型和编译器产生大量的CPU指令来进行,你在写operator+任务。

+0

Nawaz所以如果我有一个如果像1 + 2(int addtion/primitive dataytpe)这样的语句不会调用重载操作符,但只有在执行了对象添加时才会调用它,那么将调用它来覆盖操作符+说明添加两个对象。我正确地对 – munish 2011-06-02 07:03:31

+0

@明确的:是的。您为特定的用户定义类型定义'operator +'; 'operator +'不会被调用整数加法;他们也不会被其他用户定义的类型调用。 – Nawaz 2011-06-02 07:08:17

+1

出于重载解析的目的,编译器的行为“好像”有函数'operator +(int,int)'等等。你不能定义它们,但这并不意味着它们在概念上不存在。 – 2011-06-02 07:30:42

1

可以重载自定义数据类型的运营商,即类.. int是一种原始数据类型和原始类型的运营商是由编译器本身实现的,基本上它只是一个简单的CPU指令加INT等

2

我认为你会混淆两件事:操作符重载,以及如何为用户定义的类型定义一个操作符。操作符重载不是 新的;它已经存在于C中,其中+过载于int,unsigned int,long,unsigned long,float,doublelong double。在 C++中,可以通过定义名为operator+的 函数为用户定义的类型添加运算符,以便重载列表更长。并且为了使事物更加连贯,编译器解决过载的方式是 ,以将合成签名沿着operator+(int, int) 的行添加到重载列表。如果重载分辨率然后结束 选择这些合成的签名之一,它使用内置的 运算符,生成所需的任何机器代码(可能 涉及在机器代码级别的函数调用)。 选择“内置”过载之一的事实在 其余代码中会产生影响:用户定义的操作符被认为是一个函数调用, 带有相应的序列点以及其余所有内容,以及 编译器特别是不允许对其 语义—做出任何假设,编译器不能假定定义operator+的用户 是关联或可交换的。内置运算符 (极少数例外)不会引入任何序列点,并且编译器知道其语义,因此可以进行优化。

请注意,生成的机器码可能没有那么不同。我有 已使用的机器,其中编译器必须调用函数来乘以 int s,并且编译器可以(并且通常会)内联用户定义的 运算符。我上面提到的规则有哪些变化:用户定义的运算符中存在 序列点,以及编译器无法对可能适用的各种数学规律做出假设。

+0

“操作符重载不是新的;它存在已经在C中,其中+在int上重载,unsigned int,long,unsigned long,float,double和long double“@James你是否说过它已经在C++中被覆盖了。 – munish 2011-06-02 07:37:42

+0

嗯,我得到它们被重叠+ 1(很合理) – munish 2011-06-02 08:00:24

+0

你是说任何编译器实际上是以这种方式在内部工作吗?即通过部署它们的函数重载解析机制从字面上解析算术运算符,合成函数可能具有一些标记以向优化器指示没有隐含序列点?怎么样的C编译器不是C++编译器,因此根本不需要函数重载解析机制? – 2011-06-02 10:01:37