c primer 函式探幽

2021-06-27 13:21:54 字數 2365 閱讀 7262

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...