自考 C 雜記 函式和函式模板

2021-09-25 11:30:32 字數 3146 閱讀 7026

目錄

函式和函式模板

一、函式的引數及其傳遞方式

1.c++的函式引數有兩種傳遞方式:

2.函式引數的三種型別:

二、預設引數以及使用const保護資料

三、函式返回值的4種情況

3.1返回引用的函式

3.2返回指標的函式

3.3返回物件的函式

3.4函式返回值作為函式的引數

四、內聯函式

五、函式過載和預設引數

六、函式模板

6.1函式模板的宣告和定義:

6.2函式模板的呼叫:

傳值和傳引用,其中傳值可分為傳物件值和傳位址值,傳位址值的時候傳的實際是位址的整數值,也還是傳值。

傳遞物件位址值是使用物件指標作為引數,傳遞位址時使用物件引用作為引數。

示例:

非陣列指標或引用型變數做實參時,它和對應虛參之間的資料傳遞方式是( b )。

a.位址傳遞

b.單向值傳遞

c.雙向值傳遞

d.由使用者指定傳遞方式

非陣列指標做實參和對應虛參之間的資料傳遞方式是單向位址值的傳遞。

引用型變數做實參時,它和對應虛參之間的資料傳遞方式是單向數值傳遞。

引用型變數做形參時,它和對應實參之間的資料傳遞方式是位址傳遞。下面是引用型變數做實參時的程式例項:

#include #include using namespace std;

void swap(string s11, string s22)

void swap(string s1,string s2) //函式定義,s1,s2是string類的形式引數

(b)物件指標作為函式引數:

將指向物件的指標作為函式引數,形參是物件指標(指標可以指向物件的位址),雖然引數傳遞方式仍然是傳值的方式,但因為形參傳遞的就是實參本身,所以當函式中改變形參的值時,改變的就是原來實參的值。傳物件位址值要用到物件的指標。(2018版p52)

//為說明問題簡化書上例子,詳見p52頁

void swap(string *,string *); //函式宣告,傳遞的是string類的指標作為形式引數

void main()

void swap(string *s1,string *s2) //函式定義,形式引數s1,s2是string類的指標

(c)引用作為函式引數:

這時函式並沒有對形參物件初始化,即沒有指定形參物件是哪個物件的別名。在函式呼叫時,實參物件名傳給形參物件名,形參物件名就成為了實參物件名的別名。實參物件和形參物件代表同乙個物件,所以改變形參的值就是改變實參的值。

實際上就是把實參的位址傳給了形參物件,從而使形參和實參共享乙個儲存單元,可以簡單地認為是把實參的名字傳給引用物件,使引用物件成為實參物件的別名。

在說明引用引數的時候,不需要提供初始值,其初始值在函式呼叫時由實參物件提供。(2018版p53)

//為說明問題簡化書上例子,詳見p53頁

void swap(string &,string &); //函式宣告,傳遞的是string類的引用物件作為形式引數

void main()

void swap(string &s1,string &s2) //函式定義,形式引數s1,s2是string類的引用物件

預設引數是在函式原型中說明的,預設引數可以多於1個,但必須放在引數序列的後部。

用const傳遞引數,意思通知函式,只能使用引數而無權修改它。

//為說明問題簡化書上例子,詳見p55頁

void display(const int &i,string s1, string s2="",string s3 =""); //函式宣告,i用const修飾

void main()

; //全域性陣列

int & index(int i); //返回引用的函式原型宣告

void main()

max(55,max(25,39));
c++編譯器會在遇到這個內聯函式的地方呼叫函式體替換其呼叫表示式,除迴圈、switch不能做內聯函式外,其他都可以說明為內斂函式。

語法:inline + 一般函式定義

函式過載是一種靜態聯編,在程式被編譯時進行,因此也稱為編譯的多型性。

函式的重載體現在其引數列表的不同即引數的型別和個數的不同。

使用預設引數,就不能對少於引數個數的函式進行過載,因為編譯器無法判斷去使用用了幾個引數的函式。

函式模板的寫法如下:

template 返回值型別 模板名(形參表)

其中的 class 關鍵字也可以用 typename 關鍵字替換,例如:

template
函式模板看上去就像乙個函式。函式max模板的寫法如下:

template t max(t m1,t m2)

t 是型別引數,代表型別。編譯器由模板自動生成函式時,會用具體的型別名對模板中所有的型別引數進行替換,其他部分則原封不動地保留。同乙個型別引數只能替換為同一種型別。編譯器在編譯到呼叫函式模板的語句時,會根據實參的型別判斷該如何替換模板中的型別引數。

顯式比較準則:函式模板名  《模板引數》 (引數列表),如:max (1,2) 就能知道模板引數是 int 。

預設呼叫方式:函式模板名 (引數列表),由這個呼叫的函式引數列表必須要能夠唯一地標識出模板引數的乙個集合。

//改錯題:

#includetemplatevoid swap(t& a,t& b)

void main( )

C 函式模板和模板函式

函式模板可以用來建立乙個通用的函式,以支援多種不同的形參,避免了過載函式的多個函式體。它的最大特點是把函式使用的資料型別作為引數。函式模板的宣告形式為 template 返回型別 函式名 參數列 其中,template是定義模板函式的關鍵字 template後面的尖括號不能省略 例如 templat...

C 模板 函式模板和模板函式

1.函式模板的宣告和模板函式的生成 1.1函式模板的宣告 函式模板可以用來建立乙個通用的函式,以支援多種不同的形參,避免過載函式的函式體重複設計。它的最大特點是把函式使用的資料型別作為引數。函式模板的宣告形式為 template 返回型別 函式名 參數列 其中,template是定義模板函式的關鍵字...

C 模板 函式模板和模板函式

1.函式模板的宣告和模板函式的生成 1.1函式模板的宣告 函式模板可以用來建立乙個通用的函式,以支援多種不同的形參,避免過載函式的函式體重複設計。它的最大特點是把函式使用的資料型別作為引數。函式模板的宣告形式為 template 返回型別 函式名 參數列 其中,template是定義模板函式的關鍵字...