1. 程式人生 > >c++中函式的引數傳遞,行內函數和預設實參的理解

c++中函式的引數傳遞,行內函數和預設實參的理解

1.引數傳遞

 

1)函式呼叫時,c++中有三種傳遞方法:值傳遞、指標傳遞、引用傳遞。

給函式傳遞引數,遵循變數初始化規則。非引用型別的形參一相應的實參的副本初始化。對(非引用)形參的任何修改僅作用域區域性副本,並不影響實參本身。

為了避免傳遞副本的開銷,可將形參指定為引用型別。對引用形參的任何修改會直接影響實參本身。應將不需要修改實參的引用形參定義為const引用。

2)引用作為引數的特點:

a.傳遞引用給函式,被掉函式的形參作為原來主調函式中的實參變數或物件的一個別名使用,所以被調函式中對形參變數的操作就是對其相應的目標物件(主調函式)的操作。

b.使用引用傳遞函式的引數,在記憶體中並沒有產生實參的副本,他是直接對實參操作。而使用一般變數傳遞函式的引數,當發生函式呼叫時需要給引數分配儲存單元,形參變數是實參變數的副本。如果傳遞的是物件,還將呼叫拷貝建構函式。所以傳輸資料較大時,使用引用比一般變數傳遞引數的效率和所佔空間都好。

c.使用指標作為函式的引數能達到引用的效果,但是,在被呼叫函式中同樣要給形參分配儲存單元,且需要重複使用“*指標變數名”的形式進行運算,容易產生錯誤且閱讀性較差。另一f方面,在主調函式的呼叫點處,必須用變數的地址作為實參,而引用更加容易使用,清晰。

2.行內函數

行內函數,一般用inline修飾。

1)成員函式稱為內聯。在類中成員函式全部預設為行內函數。在類中宣告的成員函式如果加了inline,則其為行內函數,如果沒有加inline,在類外定義該成員函式時加了inline,該成員函式也為行內函數。

2)普通函式稱為行內函數。在普通函式的定義或申明前加inline使其成為行內函數。通常編譯時,呼叫行內函數的地方,將不進行函式呼叫,而是使用函式體替換呼叫處的函式名。

形式類似巨集替換(內聯擴充套件)

3)內聯機制適用於優化小的,只有幾行而且經常被呼叫的函式(大多數編譯器支援 遞迴函式的內聯)

3.預設引數

1)預設引數只在函式宣告中設定一次。只有在無函式宣告時,才可以在函式定義中設定。

2)預設引數的順序自右向左,即一個引數設定了預設值時,其右邊的引數都要有預設值

3)預設引數呼叫時,遵循引數呼叫順序,自左向右逐個呼叫(與第2點分清楚)

4).巨集定義和行內函數的區別:巨集定義是在預處理階段進行程式碼替換,而行內函數是在編譯階段插入程式碼。巨集定義沒有型別檢查,行內函數有型別檢查。