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