2011-06-02 51 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