c語言(c89)不支援帶有預設值的函式
c++(c++99)支援帶有預設值的函式:要從右到左,給形參,預設值。
那麼什麼是帶預設值的函式呢?
int
sum(
int a=10,
int b=20)
intmain()
這就是傳說中的帶預設值的函式,它的實參不是通過函式呼叫傳遞的而是通過在定義或聲 明函式時在函式體內給出的預設實參。如果再從函式呼叫中給出實參則預設實參將被覆蓋,失去其意義。
而且帶預設值的函式的引數還是有一定限制的,函式傳參是從左至右依次傳遞引數,如果從左至右前面有預設值,後面沒有就會發生錯誤。例如:
int
sum(
int a=10,
int b)
intmain()
上面的**就是錯誤**,會顯示: error c2548: 「sum」: 缺少引數 2 的預設引數
error c2660: 「sum」: 函式不接受 1 個引數
所以,我們使用帶預設值的函式時一定要注意呼叫引數與函式預設值的匹配,避免出現上面**出現的錯誤。
c++關鍵字,在函式宣告或定義中函式返回型別前加上關鍵字inline,即可以把函式指定為內聯函式。關鍵字inline必須與函式定義放在一起才能使函式成為內聯,僅僅將inline放在函式宣告前面不起任何作用。inline是一種「用於實現的關鍵字」,而不是一種「用於宣告的關鍵字」。一般的,使用者可以閱讀函式的宣告,但是看不到函式的定義。
inline函式與普通函式的區別:
inline函式相當於c語言中的巨集,呼叫inline函式就相當於巨集替換,把inline函式中的**複製過來,不重新開闢棧空間。內聯函式和普通函式相比可以加快程式執行的速度,因為不需要中斷呼叫,在編譯的時候內聯函式可以直接唄鑲嵌到目標**中
inline函式與巨集#define的區別:
巨集定義使用預處理器實現,做一些簡單的字元替換因此不能進行引數有效性的檢測。另外它的返回值不能被強制轉換為可轉換的合適型別,且c++中引入了類及類的訪問控制,在涉及到類的保護成員和私有成員就不能用巨集定義來操作。
(1)內聯函式在編譯時展開,巨集在預編譯時展開;
(2)內聯函式直接嵌入到目標**中,巨集是簡單的做文字替換;
(3)內聯函式有型別檢測、語法判斷等功能,而巨集沒有;
(4)inline函式是函式,巨集不是;
(5)巨集定義時要注意書寫(引數要括起來)否則容易出現歧義,內聯函式不會產生歧義;
c語言不支援函式過載,
c++支援函式過載
那麼什麼是函式過載呢?
過載函式是函式的一種特殊情況,為方便使用,c++允許在同一範圍中宣告幾個功能類似的同名函式,但是這些同名函式的形式引數(指引數的個數、型別或者順序)必須不同,也就是說用同乙個運算子完成不同的運算功能。這就是過載函式。過載函式常用來實現功能類似而所處理的資料型別不同的問題。
兩個過載函式必須在下列乙個或兩個方面有所區別:
1、函式有不同引數。
2、函式有不同引數型別,
c++的這種程式設計機制給程式設計者極大的方便,不需要為功能相似、引數不同的函式選用不同的函式名,也增強了程式的可讀性。
int sum (
int a,
int b)
float
sum(
float a,
float b)
intsum
(int a)
上面的**就是利用函式過載,將三個函式名相同的,形參型別不同或個數不同的函式定義在同一段程式中。
說了這麼久的c和c++的區別,我們還不知道c和c++之間能不能相互調呢?
答案是可以也不可以。
為什麼是可以也不可以呢?因為c語言是面向過程的一門高階語言,c++是物件導向的高階語言,在同乙個編譯器編譯.c檔案和.cpp檔案的時候會生成不同的符號,那麼在相互呼叫時會因為符號無法識別或識別錯誤就會導致**錯誤。
那麼,為什麼又是可以呢?這裡就要提到extern關鍵字和中間介面檔案。
例如:在乙個.cpp檔案想要呼叫乙個.c檔案的函式時,我們需要用extern關鍵字就可以實現:
extern「c」
那麼就會有人說是不是在extern關鍵字後加「.cpp」就可以c語言檔案呼叫.cpp檔案了,並非如此;
因為extern關鍵字是c++中的c語言就識別不了這個關鍵字,那麼該怎麼做呢?
這時候我們就需要建立乙個中間檔案了,建立乙個.cpp的中間檔案,看**:在mid.cpp中:
int
sum(
int a,
int b)
;extern
"c"}
這樣就完成了.c檔案呼叫.cpp檔案函式的功能了。 c與c 的區別(一)
最近在學習c 很多人都說c 是c的擴充,但是我認為這兩種語言雖說前面的語法是差不多的,但是後期的程式設計包括思想都是不同的。我覺得以這本書為我的學習書目,總結一些c和c 不同的地方,當然也有一些是以前我沒有注意到的地方,不代表c中沒有這種特性。1.main 函式的返回型別必須為int,即整數型別。i...
C 與C 的一些區別
最近在學習c 總結了一些c 與c 的區別 1.c 不支援多重繼承。2.c 檔案是.h,cpp,而c 檔案是.cs。3.c 宣告類時,括號後沒有 4.與c c 不同,c 在類的外部不能宣告全域性變數,也沒有全域性函式。6.c 中的var相當於c 中的auto。7.c 中不管巢狀級別如何,都不能在第乙個...
C 與C的區別
l c如果不寫返回值,預設是int,而c 中不能不寫返回值 可用void表示無返回值 如func1 l int func1 在c中表示可帶任意引數的函式,這是c的漏洞,使得它避開了引數型別檢查 而c 中表示不帶引數的函式。2 標頭檔案的區別 l c 的標頭檔案去掉了c中的.h,以c字首開始。比如,變...