C PP Chapter VIII 函式探幽

2021-07-15 01:55:13 字數 3204 閱讀 2934

1.  c++的內聯函式

它的存在目的就是在編譯時就將函式全部複製到要使用的地方,稍微優化了時間

而它又是按值傳遞,所以區別於普通的巨集函式

使用該特性必須在 內聯函式宣告或者函式定義前加上關鍵字 inline

可以當作常規函式呼叫

例如:inline

double square (double x)

內聯函式不能遞迴!**過長等會被視為常規函式

2. 引用變數 (c++新增的復合型別)

引用是已定義的變數的別名,可對該變數直接操作

注意的是宣告引用時必須將其初始化

引用方法 例如:

int & rodnets = rats;

於函式傳遞中使用,避免了指標出錯問題

若函式是引用的 那麼宣告\定義 為 stuats function(stuats & a,...)

而在使用的地方與按值傳遞無差別

對引用加 const : const

int &a = b;

將引用用於結構體和類的傳遞

3. 函式返回引用:

例如 結構體 structp

函式 structp & funx(structp & target)

stuats funy(structp & target)

返回structp &,那麼funx返回的引用便是實際的元素,

如果只是返回 structp 型別,那麼返回的是乙個副本

這使得 funy(funx(team)) 這樣的函式呼叫出現差別:對於前者funy可改變原資料

//結構體可以直接賦值

而對於 structp & funx(structp & target)

使用時可以 funx(team) = (structp) other 因為返回的是乙個引用,可被賦值

注! 返回的往往是作為引數傳遞給函式的引用(可以是隱式的),因為函式結束

會將原本屬於函式內的元素釋放

當然用 new 申請的也可作為返回物件,要注意的是使用完後需要 delete

對於返回的引用可以使用 const 進行修飾

4. 將引用用於類物件

與引用結構體相似

而形參為 string ,實參可以為 char *,因為c++內有 char *到 string 的轉換功能

5. 物件、繼承和引用 (見第13和17章筆記)

6. 預設引數

預設引數指的是當函式呼叫中省略了實參時自動使用的乙個值

例如:void cal(int n)

如果把 n 設定為預設值 1 ,那麼直接用 cal() 就相當於 cal(1)

設定預設值的方法

在函式原型中,必須自右相左的新增預設值

例如:int harpo(int n=1,int m=4,int j=5); //valid

使用時可以部分預設(或全預設) harpo(2); //valid

但是實參必須自左向右的賦給形參,不能跳過

harpo(2,,2) //invalid

int chico(int n=1,int m,int j=9); //invalid

7. 函式過載(函式多型)[通過編譯器的名稱修飾來區分]

使得可以使用多個重名的函式,使得他們使用不同的引數列表完成相同的工作

函式的引數列表又稱為函式特徵標

如果兩個函式的引數數目和型別相同,同時引數的排列順序也相同,則它們的特徵標相同

注意不要出現 double cube(double x);

double cube(double &x);

因為使用cube(n)時會出現兩個都匹配的情況

匹配函式時,不區分是否為 const 變數

注意:函式返回型別可以不同,但是特徵標必須不同!

函式過載中可以使用預設引數

8. 函式模板

函式模板允許以任意型別的方式來定義函式

必須關鍵字 template 、 typename(可以用 class 為舊式的)

格式例如:

template

--> anytype 為任意型別名

void swap(anytype &a,anytype &b)

模板本身不建立任何函式,但是它會指定編譯器去定義函式

9. 過載的模板

要求被過載的模板的函式特徵標必須不同,其他的和常規函式過載類似

10. 模板的顯示具體化和例項化

具體化:

目的是使其能夠用於特定的結構或類(另一種方法是為它們過載運算子)

當編譯器找到與函式呼叫匹配的具體化定義時,會使用該定義而不找模板

iso/ansi c++98 標準:

a. 對於給定的函式名,可以有非模板函式、模板函式、

顯式具體化模板函式和它們的過載版本

b. 顯示具體化的原型和定義應以template

<>打頭,並通過

名稱來支援型別

格式例如:

template

<> void swap(job &,job &);

c. 優先順序: 非模板函式 > 具體化 > 模板函式

例如:void swap(job &,job &);

template

void swap(t &,t &);

template

<> void swap(job &,job &);

可等價簡化為 template

<> void swap(job &,job &);

例項化:

隱式,就是當執行時,遇到型別時生成使用

顯式例項化,在編譯時就要求編譯出該型別的函式

差別在於,具體化的函式是自己編寫的,而顯式例項化,給出命令讓編譯器實現就可以了

格式例如:

template

void swap(int,int); //template 後沒有 <>

11. 函式模板的發展

a. c++11 關鍵字 decltype

使用該關鍵字 decltype(x+y) z; 相當於宣告了乙個 和 x+y 型別相同的變數 z

b. c++11 後置返回型別

針對了模板函式的返回型別不確定情況

結合關鍵字 auto

於是格式 :

template

auto fun(t1 x,t2 y) -> decltype(x+y)

WaitForSingleObject函式的使用

程式舉例 1 建立對話方塊應用程式,專案名稱為mytestthread 2 新增按鈕,命名為啟動和停止,在對話方塊中增加編輯框,id為idc time,3 增加成員變數,handle m hthread 2 此為執行緒的控制代碼 4 定義全域性變數,用來控制線程的執行與否 volatile bool...

cvCreateVideoWriter函式使用

cvcreatevideowriter函式使用 2011 11 04 15 47 例如,cv fourcc p i m 1 是mpeg 1 codec,cv fourcc m j p g 是motion jpeg codec cv fourcc m p 4 2 mpeg 4.2 codec cv f...

CentimetersToPoints函式出錯

在word開發中,碰到centimeterstopoints函式呼叫出錯,提示未指定的錯誤的問題。解決辦法為修改centimeterstopoint函式 匯入msword.olb後的centimeterstopoint函式如下 修改後的centimeterstopoint函式如下,紅色表示的部分為增...