在c++中,運算子和函式有什麼區別?
首先看下運算子的定義:
函式型別 operator 運算子(形參表)
{
函式體;{
譬如++運算子的過載為:
class lei{
friend lei operator++(const lei& );
}
呼叫的時候
lei entity = lei();
entity++;
這裡面當我們呼叫entity++的時候,編譯器自動的為我們生成operator++(entity)。
csdn上有一篇針對運算子和函式的區別的解答,覺得有一定道理:
- 語法形式上有區別
- 運算子只能過載,不能自定義,函式的名字隨便起,只要是個識別符號就行;但運算子不行,比如,你無法仿照其他語言的符號,自定義一個乘法運算子“”**“”
- 任何函式都可以過載或者覆蓋,但通常你不能改變運算子作用於內建型別的行為,比如你不能通過過載"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。