1.內聯函式
正常呼叫函式的時候,指標跳到函式所在的位置,執行完之後返回到呼叫該函式的記憶體處。內聯函式的編譯**與其他程式內聯起來,執行的時候無需跳到另乙個位置處,但是會犧牲記憶體。
如果**執行時間短,則內聯呼叫就可以省去非內聯呼叫使用的大部分時間;如果函式經常被呼叫,也可以使用內聯;內聯函式不能遞迴。
使用:在函式宣告前加上關鍵字inline或者在函式定義前加上inline。
c語言中的巨集定義是內聯函式的原型,比如#define square(x) x*x,但是只是將x替換,不能按值傳遞。
2.引用
(1)引用是指標的偽裝表示,但是其只能在初始化時賦值,類似於const型別的指標。
int & a=b; 等同於 int * const c=&b;
a和*c等同於b,&a和c等同於&b。a成為了b的別名。
(2)將引用作為函式引數,允許函式修改引數的值。
如果引用是const型別,那麼在以下兩種情況下會生成臨時變數:
實參型別正確,但不是左值;
實參型別不正確,但可以轉換為正確的型別。
建議在不修改實參的情況下將引用引數宣告為常量資料的引用,原因有以下幾點:
const使函式能夠處理const和非const的實參,否則將只能接受非const資料;
使用const引用能夠使函式能夠正確生成並使用臨時變數。
(3)將引用用於結構
struct sysop;
const sysop & use(sysop & sysopref)
void main()
;use(looper);
}
(4)將引用用於類
string version(const string &s1,const string &s2)
//正確,s1和s2都不會被改變.也可以使用char*型的變數作為實參
const sting & version2(string &s1,const string &s2)
//有負面影響。這裡s1就只能是string型的變數,char*的變數會出錯。而s2就能夠是char*型的變數。
const string & version3(string &s1,const string&s2)
//錯誤的,變數tmp在函式呼叫結束之後就會釋放,他的值會存在乙個臨時記憶體中,不能將他作為引用來返回
(5)物件、繼承和引用
基類引用可以指向派生類物件,不用進行強制轉換。
(6)小結
修改呼叫函式中的資料物件;傳遞引用而不是整個資料物件。
不需要修改值時:
資料很小時,值傳遞;
資料物件是陣列時,使用const指標;
資料物件時較大的結構,使用const指標或者const引用;
資料物件時類物件時,使用const引用。
要修改值時:
資料物件為內建資料型別,則使用指標;
資料物件為陣列,則使用指標;
資料物件為結構,使用指標或引用;
資料物件為類,則使用引用。
3.預設引數
將值付給函式原型中的引數。
從右向左新增預設值,即要為乙個變數賦預設值,必須使得它右邊的變數都賦有預設值。
int function(int m,int n=10,int j); //錯誤
函式呼叫的時候從左向右將實參賦值給形參,不能跳過任何引數。
b=function(3,,5) //錯誤
4.函式過載
引數型別和任何過載函式的形參型別都不同時,c++將嘗試強制轉換,但是如果有多種轉換方式都滿足,則報錯;
編譯器在檢查特徵標的時候,將引用和型別本身視為同一特徵標;
函式返回型別可以不同,但特徵標必須不同。
5.函式模板
template//這裡寫成template也可以,any只是乙個名稱
void swap(any &a,any &b)
template//這個在函式宣告和函式定義的前面都要加上
void swap(any ,any ,int) //模板的過載應用。模板函式的形參並不一定都是模板引數
{ any tmp;
for(int i=0;istruct job;
void swap(job &a,job &b);
templatevoid swap(job &a,job &b);
template<>void swap(job &a, job &b); //或者也可以寫成template<>void swap(job &a,job &b).
C primer 第8章節 函式探幽
1.內聯函式比一般的函式執行速度要稍快,但是代價是需要付出更多的記憶體。如果程式在10個地方呼叫同乙個內聯函式,那麼該程式將包含該程式的10個副本。2.使用內聯函式,可以有三種方法 1 在函式宣告的時候,加上關鍵字inline.2 在函式定義的時候,加上關鍵字inline.3 類中實現的函式,將自動...
C PP Chapter VIII 函式探幽
1.c 的內聯函式 它的存在目的就是在編譯時就將函式全部複製到要使用的地方,稍微優化了時間 而它又是按值傳遞,所以區別於普通的巨集函式 使用該特性必須在 內聯函式宣告或者函式定義前加上關鍵字 inline 可以當作常規函式呼叫 例如 inline double square double x 內聯函...
c 函式探幽
inline double square double x int rats 1,next 2 int rodents rats rodents next 賦值操作而已必須在宣告引用變數時進行初始化。一旦與某個變數關聯,將不能改變關聯關係。void swap int a,int b const fr...