How to Write a Function
得到某個類型的最大/最小值衅码,參考標準庫
numeric_limits class
#include <limits>
int max_int = numeric_limits<int>::max();
double min_dbl = numeric_limiys<double>::min();
Invoking a Function
reference 引用
???????在為了函數(shù)的參數(shù)和傳入的實際對象產(chǎn)生關聯(lián),(可以簡單認為修改參數(shù)捂人,就可以修改實際對象)逐纬,可以通過傳址(pass by reference)來實現(xiàn)蛔屹,最簡單的方法就是將參數(shù)聲明稱一個reference
void ChangeValue(int & value)
{
value = 666;
}
????????將參數(shù)聲明為reference
:
??????????? 1. 希望得以直接對傳入的對象進行修改
??????????? 2. 降低復制大型對象的額外負擔
????????但是在傳遞==內(nèi)置類型==的時候,建議==不要==使用傳址的方式豁生。
????????傳址機制主要用于傳遞class object
作用域及范圍
????????儲存期(范圍):為對象分配內(nèi)存的存活時間
????????作用域(scope):對象在程序內(nèi)的存活區(qū)域
????????對象如果在函數(shù)以外聲明兔毒,具有所謂的file scope
???????對象如果擁有file scope
,那么從他的聲明點到文件末尾都是可見的甸箱。
???????對象的內(nèi)存在main()
開始執(zhí)行前就已經(jīng)分配好了育叁,直到程序結(jié)束。
動態(tài)內(nèi)存管理
???????????內(nèi)存由程序的空閑空間(free store)分配而來摇肌,也稱為堆內(nèi)存(heap memory)
// 表達式的形式如下
// type可以是任意的內(nèi)置類型擂红,也可以是程序知道得class
new Type
// eg.1
int *pi = new int;
delete pi;
// eg.2
int *pia = new int[20]; // 聲明一個長度為20的數(shù)組仪际,但是不能給該數(shù)組初始化
delete [] pia;
???????delete
會釋放指針所指的對象
???????delete []
會釋放數(shù)組中的所有對象围小,所以指針指向數(shù)組一定用這個
???????????如果我們不使用delete
釋放對象,那么由heap
分配的對象就永遠不會被釋放树碱,這就叫==memory leak==(內(nèi)存泄漏)
Providing Default Parameter Value
提供默認參數(shù)值
void WriteSomething(string info, ofstream &ofil)
{
// code
}
???????默認情況下肯适,其實不想產(chǎn)生ofstream &ofil
這個參數(shù),用戶可能不清楚需要填寫這個參數(shù)成榜。但是又希望那些知道這個參數(shù)框舔,并且要自定義的用戶使用他們,這時候就可以使用默認參數(shù)赎婚。
void WriteSomething(string info, ofstream *ofil = 0)
{
// code
}
???????==注意==這里講引用換成了指針刘绣,這是因為引用必須代表一個對象。
默認參數(shù)規(guī)則
-
默認值的解析操作由最右邊開始挣输。如果提供了默認值纬凤,那么這一參數(shù)的右邊的所有參數(shù)必須擁有默認值。
-
默認值只能指定一次撩嚼,可以在函數(shù)聲明出停士,也可以在函數(shù)定義處挖帘。但是不能再兩個地方同時設定
???????通常函數(shù)聲明放在頭文件中,方便觀察恋技。所以為了提高可見性拇舀,默認值放在函數(shù)聲明處。
// xxx.h
void display(string str, ostream & = cout);
// xxx.cpp
include "xxx.h"
void display(string str, ostream & os)
{
os << string << endl;
}
Using Local Static Object
局部靜態(tài)對象
???????局部靜態(tài)對象所處的空間蜻底,即使在不同的函數(shù)調(diào)用過程中骄崩,依然持續(xù)存在。
Declaring a Function Inline
Providing Overloaded Function
重載函數(shù)
???????名字相同薄辅、返回類型相同刁赖,參數(shù)列表不相同的函數(shù)。
???????在函數(shù)調(diào)用的時候會根據(jù)調(diào)用者提供的實際參數(shù)列表长搀,來和每一個重載函數(shù)作對比宇弛,找出其中合適的。
Defining and Using Template Function
模板函數(shù)
???????function template
將參數(shù)列表中指定的全部(或部分)參數(shù)的類型信息抽離了出來源请。
template <typename T> // template <class T>兩者意義是一樣的
//但是建議使用typename枪芒,以防出現(xiàn)多重意思
void display(const string &msg, const vector<T> &vec)
{
// code
}
???????function template
也可以重載
template <typename T>
void display(const string &msg, const list<T> <)
{
// code
}
Pointers to Function Add Flexibility
函數(shù)指針
???????函數(shù)指針必須指明函數(shù)的返回類型和參數(shù)列表
// 這些函數(shù)返回一個vector類型的指針
const vector<int> *func1( int size );
const vector<int> *func2( int size );
const vector<int> *func3( int size );
bool IsUseFunc(const vector<int>* (*func_ptr)(int))
{
// code
}
???????只要在bool IsUseFunc(const vector<int>* (*func_ptr)(int))
傳入函數(shù)的名字就可以調(diào)用了。
???????為什么不是
const vector<int>* *func_ptr(int);
// const vector<int>** func_ptr(int);
// 聲明了一個函數(shù)
???????這句話代表的是返回類型是一個指針谁尸,這個指針指向一個另一個指針舅踪,后一個指向一個元素類型為int
的const vector
。