C++ 學習之函數:問題雜談

下面總結幾個關於函數部分知識的問題,也是自己在學習過程中概念不太清楚的東東。

1.函數返回值

當函數要返回一個引用時,千萬別返回函數中的局部對象的引用,因爲函數執行完會被釋放,局部對象會被釋放,因此對局部對象的引用將會指向不確定的內存;

當函數返回一個指針的時候,千萬別返回函數中的指向局部對象的指針,會引起懸垂指針問題。

 

2.函數聲明和默認實參

函數原型是指返回類型,函數名,和形參表。當函數僅僅是聲明的時侯,形參可以僅僅表明類型,不用有形參名。、

默認實參是指給函數的形參表中的形參提供明確的初始值來制定的。如果一個形參具有默認實參,則它後面的形參都必須有默認實參。調用默認實參的函數時,也可以重新提供給函數新的實參值,提供的實參值將覆蓋默認實參值。

 

3.內聯函數

內聯函數通常是將它在程序中每個調用點上“內聯地”展開。一般來說,內聯函數適用於優化小的、只有幾行而且經常被調用的函數。

C++中的內聯函數允許在程序中不止一次定義,只要內聯函數在某個源文件中只出現一次,在所有其他的源文件中,定義完全相同即可,因此將內聯函數放到頭文件中是一個不錯的選擇。

 

4.指向函數的指針

 

函數指針的聲明格式:類型名 (*指針名)(形參列表)

上述的類型名是函數指針所指函數的返回值的類型名;形參列表是指函數指針所指函數的形參列表。

例如:

int  (*p) (int, double);//該語句聲明瞭一個函數指針p,它指向的函數的返回值類型爲Int,形參類型爲int和double

上面的定義可以用typedef定義簡化: typedef  int (*SP) (int, double);

該語句定義了一個名字SP,它是指向函數的指針類型的名字。

函數指針的初始化和賦值通過同類型的函數或者函數指針或者0值常量表達式。(函數名可以解釋爲指向函數的指針)

如有函數:

int app (int, double) { ...........};   //定義一個函數

SP p1 = app;

SP p2 = &app;

SP p3 = 0;

上面三種均可。

通過指針調用函數,與使用變量一樣,但是此處是否使用解引用符號均可,例如:

int k = app(1, 3.2);

int k = p1(1, 3.2);

int k = (*p1)(1, 3.2);

個人覺得函數指針最難以理解的當屬返回指向函數的指針

在aC++PRIMER書中的一個例子

int(*ff(int))(int*, int);

上式實際上時聲明瞭一個函數ff(int).該函數的返回值是一個指向函數的指針,而該指針所指的這個函數的返回值是int的,所需的形參列表爲(int*, int)的。

發佈了27 篇原創文章 · 獲贊 7 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章