C 學習筆記7 C 函式的公升級 上

2021-06-23 07:06:02 字數 2378 閱讀 9751

1:常量與巨集回顧:

c++中的const常量可以替代巨集引數定義;

const int a = 5  ; 等價於 # define a 5

巨集具有***,那麼c++是否有方法避免呢?

2:內聯函式:

c++中推薦使用內聯函式代替巨集**片段

c++中inline關鍵字宣告內聯函式

inline int func(int a, int b)

return  (a < b ? a: b);

注意內聯函式宣告的時候inline關鍵字必須和函式定義在一起,否則編譯器會直接忽略內鏈請求

關於內聯函式:

c++可以將乙個函式進行內聯編譯

被c++編譯器內聯編譯的函式稱為內聯函式

內聯函式在最終生成的**中是沒有定義的

c++編譯器直接將函式體插入到函式呼叫的地方、

內聯函式呼叫沒有普通函式呼叫時的額外開銷(壓棧,跳轉,返回)

c++編譯器不一定准許函式的內聯請求!

內聯函式是一種特殊的函式,具有普通函式的特徵(引數檢查,返回型別等)

內聯函式是對編譯器的一種請求,因此編譯器可能拒絕這種請求

內聯函式由編譯器處理,直接將編譯後的函式體插入呼叫的地方

巨集**片段由預處理器處理,進行簡單的文字替換,沒有任何編譯過程

現代c++編譯器能夠進行編譯優化,因此一些函式即使沒有

inline宣告,也可能被編譯器內聯編譯

 另外,一些現代c++編譯器提供了擴充套件語法,能夠對函式進行強

制內聯 如:g++中的__attribute__((always_inline))屬性

使用內聯函式有一定的限制:

 不能存在任何形式的迴圈語句

 不能存在過多的條件判斷語句

 函式體不能過於龐大

 不能對函式進行取址操作

 函式內聯宣告必須在呼叫語句之前

編譯器對於內聯函式的限制並不是絕對的,內聯函式相對於普通函

數的優勢只是省去了函式呼叫時壓棧,跳轉和返回的開銷。因此,

當函式體的執行開銷遠大於壓棧,跳轉和返回所用的開銷時,那麼

內聯將無意義

c++中內聯函式實現機制:

inline int func(int a, int b)

int _tmain(int argc, _tchar* argv)

在c++中首先檢查是否可以進行內聯編譯,如果編譯器請求通過,那麼內聯函式func寫入到符號表

當執行int r = func(1,2);

這句**的時候,用符號表中的函式體直接替換func呼叫int r =   return  (a < b ? a: b);

3:函式的預設引數:

c++中可以在函式宣告時為引數提供乙個預設值,當函式調

用時沒有指定這個引數的值,編譯器會自動用預設值代替

int mul(int x = 0); //函式宣告時指定預設引數

int _tmain(int argc, _tchar* argv)

int mul(int x)//定義的時候不再指定

函式預設引數

 函式預設引數的規則

 只有引數列表後面部分的引數才可以提供預設引數值

• 一旦在乙個函式呼叫中開始使用預設引數值,那麼這個引數後的所

有引數都必須使用預設引數值

int add(int a, int b = 0, int c =0)

當b使用預設引數時,後面的c也必須使用預設引數

4:函式佔位引數:

在c++中可以為函式提供佔位引數

 佔位引數只有引數型別宣告,而沒有引數名宣告

 一般情況下,在函式體內部無法使用佔位引數

//函式佔位引數

int add1(int a, int b, int )

c++支援這樣的函式佔位引數

有什麼意義?

可以將佔位引數與預設引數結合起來使用

 意義

• 為以後程式的擴充套件留下線索

• 相容c語言程式中可能出現的不規範寫法

eg:在c語言中:

void func()

呼叫的時候

func(1);

func(1,2);

在c語言中可行,在c++中編譯不通過

但是void func(int = 0)

func(1)就可以編譯通過;

小結 c++中可以通過inline宣告內聯函式

 內聯函式在編譯時直接將函式體插入函式呼叫的地方

 inline只是一種請求,編譯器不一定允許這種請求

 內聯函式省去了普通函式呼叫時壓棧,跳轉和返回的開銷

 c++中在宣告函式的時候指定引數的預設值

 c++可以宣告佔位符引數,佔位符引數一般用於程式擴充套件

和對c**的相容

C 學習筆記(7) C 語句

c 程式是一組函式,而每個函式又是一組語句。c 有好多種語句型別,上篇筆記總結的表示式可以轉化為語句,通常被稱作表示式語句。除此之外,還有空語句 返回語句 return 0 復合語句 程式塊 等。以上又被統稱為簡單語句。相對於簡單語句,c 還有類似於c語言的特殊語句,條件語句 迴圈語句以及轉移語句。...

C語言學習筆記 7 C語言中的小數

小數是由整數和小數兩部分組成,由點號.隔開,如0.23 0.444 23.67 3.98等都是合法小數,屬於十進位制數。除此外,還有指數形式,如7.25103 0.035105 27.36 10 3等。任何小數都可以用指數形式來表示。在c語言中,小數的指數形式為 aen或aen解釋 a為尾數部分,是...

7 C 類的使用

定義了乙個類之後,便可以如同用int double等型別符宣告簡單變數一樣,建立該類的物件,稱為類的例項化。類的定義實際上是定義了一種型別,類不接收或儲存具體的值,只作為生成具體物件的 藍圖 只有將類例項化,建立物件 宣告類的變數 後,系統才為物件分配儲存空間。class computer 類定義 ...