第8章 函式探索

2021-07-05 06:42:33 字數 1973 閱讀 2547

第8章   函式探索

8.1c++內聯函式

(1)常規函式的執行過程:

執行到函式呼叫指令時,程式將在函式呼叫後立即儲存該指令的記憶體位址,並將函式的引數複製

到堆疊(為此保留的記憶體塊),跳到標記函式起點的記憶體單元,執行函式**(也許還將返回值

放入到暫存器中),然後跳回到位址被儲存的指令處。

(2)內聯函式:

[1]**執行時間短,函式經常被呼叫

[2]定義:編譯器將使用相應的函式**替換函式呼叫,程式無需再跳到另乙個位置處執行,在跳 回來

[3]如何選擇:

如果執行函式**的時間比處理函式呼叫機制的時間長,則節省時間將只佔整個過程的很小一部

---- ------

分[4]內聯函式不能遞迴

[5]請求將函式作為內聯函式時,編譯器並不一定會滿足這種要求

[6]內聯與巨集

#include#define square(x) ((x)*(x))

inline double square(double x)

using namespace std;

int main()

//使用者要求字元數目可能多於字串包含的字元數

int len=strlen(str);

n=n>str/*>>n*/)

return num;

}else

} (3)何時使用?

p289

函式基本上執行相同的任務,但使用不同形式的資料時

使用乙個但預設引數的函式簡單些

8.5函式模板

(1) templatevoid swap(t &a,t&b)

templatevoid swap(t a,t b,int n)

; template<>void swap(job &j1,job &j2) --具體化原型

templatevoid swap(t &a,t &b)

8.5.4

(1)編譯器使用模板為特定型別生成函式定義時,得到函式模板的例項

(2)模板並非函式的定義,但是使用int的模板例項是函式定義

(3)隱式例項化:由於呼叫swap()函式時提供了int

(4)顯示例項化:直接命令編譯器建立特定的例項

template void swap(int,int);

(5)顯示具體化template<>void swap(int&,int&);

template<>void swap(int &,int &)

(6)試圖在同乙個檔案(或轉換單元)中使用同一種型別的顯示例項化和顯示具體化將出錯

(7)顯示例項化:template

顯示具體化:template<>

8.5.5

(1)指向非const資料的指標和引用優先於非const指標和引用引數列表

const和非const之間的區別只適用於指標和引用指向的資料

二義性錯誤:

struct blot ;

blot ink=;

recycle(ink);

void recysle(blot);

void recycle(const blot);

(2)乙個完全匹配優先於另乙個的另一種情況,非模板函式優先於模板函式(顯示具體化)

(3)如果兩個完全匹配的函式都是模板函式,則較具體的模板函式優先

struct blot ;

blot ink=;

recycle(&ink); 選#2

templatevoid recycle(type t) #1

templatevoid recycle(type *t) #2

兩個隱式例項

recycle(blot*) #1

recycle(bloe *) #2

第8章 函式

位置實參,關鍵字是參 預設值,注意順序,把已經有預設值的放在最後 topping這個可以接收任何實參,一般放形參最後,它是個空元組,當作列表一樣就行 def pet name,size 27 預設值 print name size n input please get me a name s inp...

第8章 函式

定義函式,注意書寫格式 向函式傳遞資訊 實參和形參 傳遞實參 位置實參,注意順序 關鍵字實參,名稱和值對應,寫在函式裡,務必準確指定函式定義的形參名 預設值混合使用時,注意格式,讓實參變成可選的,新增預設值,並且放在形參列表最後 切片法 建立列表副本 星號建立空元組,傳遞任意數量的實參 結合使用位置...

第6章 函式 第8題

題目 輸入乙個金額,用100 50 20 10 5 1進行換算。不一定是這幾張面額 而且這幾張面額的數量也可以有限制。為了簡化問題,這裡選取了人民幣的面額,以及預設每種面額都沒有數量限制 1.貪心演算法 輸入乙個金額,用100 50 20 10 5 1進行換算 include using names...