1. 程式人生 > >在c++中,運算子和函式有什麼區別?

在c++中,運算子和函式有什麼區別?

首先看下運算子的定義:

函式型別 operator 運算子(形參表) 

  
函式體;

譬如++運算子的過載為:

class lei{

friend lei operator++(const lei& );

}

呼叫的時候

lei entity = lei();

entity++;

這裡面當我們呼叫entity++的時候,編譯器自動的為我們生成operator++(entity)。

csdn上有一篇針對運算子和函式的區別的解答,覺得有一定道理:

  1. 語法形式上有區別
  2. 運算子只能過載,不能自定義,函式的名字隨便起,只要是個識別符號就行;但運算子不行,比如,你無法仿照其他語言的符號,自定義一個乘法運算子“”**“”
  3. 任何函式都可以過載或者覆蓋,但通常你不能改變運算子作用於內建型別的行為,比如你不能通過過載"operator+",讓3+2產生6.
其實總結來看,運算子本質上也是函式。只是運算子是編譯器需要進行進一步解釋。而函式是直接呼叫。

new\delete 與 malloc\free區別

new/\delete是運算子,malloc\free是函式。因此我們可以過載new運算子。

        new會自動的呼叫類的建構函式,會丟擲異常,malloc只是負責分配記憶體,無法定義malloc失敗時的預設行為,但你可以定義new失敗時的預設行為,比如讓它不丟擲異常。

new和malloc返回的型別不一樣。new 返回的是該型別的指標,malloc返回的是void*指標。

過載new\delete

運算子是語言自身的特性,它有固定的語義,而且編譯器也知道意味著什麼。就像 +-*/ 一樣,由編譯器解釋語義,生成相應的程式碼。

 庫函式是依賴於庫的,沒有庫就沒有它,也就是一定程度上獨立於語言的。理論上,編譯器不知道也不關心函式的作用,編譯器只保證編譯函式,以及呼叫該函式時引數和返回值符合語法,並生成相應 call 函式的程式碼。但實際中一些高階點的編譯器,都會對標準庫自帶的一些函式進行特別處理。

 malloc與free是C++/C語言的標準庫函式,new/delete是C++的運算子。對於非內部資料型別的物件而言,光用malloc/free無法滿足動態物件的要求。

物件在建立的同時要自動執行建構函式,物件消亡之前要自動執行解構函式。由於malloc/free是庫函式而不是運算子,不在編譯器控制權限之內,不能把執行建構函式和解構函式的任務強加於malloc/free。