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