1. 程式人生 > >淺談static、類模板和函式模板

淺談static、類模板和函式模板

首先,我們先來看static,從C語言我們知道,他是一個靜態變數的識別符號,可以讓一個變數在離開作用域後,還能夠存活。那麼如果我們在類當中定義了一個static資料會怎麼樣,這個static資料會在程式開始前就會存在,而且僅此一份。那麼static function呢,簡而言之就是,操縱static變數的函式,舉個例子,現在我們要計算一個基金增長利率,那麼這個利率對於所有的物件來說,都是一樣的,那麼把它宣告為static變數會更有效率以及更節省空間。
class Accout{
public:
    static double m_rate;  //宣告式
    static void set_rate(const double& x)const{ m_rate = x;}
}
static double m_rate = 20;//定義式(即真正分配記憶體開始的地方)

int main(){
    Account::set_rate(5.0); //可以用類呼叫
    Account a;
    a.set_rate(5.0);//可以用物件呼叫,因為函式是static的,這時候不會傳遞&a也就是this指標
    return EXIT_SUCCESS;
}
進一步來說,在Singleton(單體)設計模式中,我們可以知道一個class就只存在一個物件,那麼這個物件就是static的,為了讓別人無法建立物件,我們需要把建構函式,拷貝建構函式放入private中,通過一個函式介面來獲得這個static物件,大致思路如下所示:
class A{
public:
    static A& get_object() const{return a;}
    void fun();
private:
    A();
    A(const A& rhs);
    static A a;
}

我們只能通過A::get_object()來獲得物件然後使用fun成員函式,像這樣:A::get_object().fun().此時我們發現object a一直存在,這時候是不是有點浪費呢,如果我沒用到這個static物件,所以提出了一種改良的方法就是,我用到了我再建立,給他定義為static,他就一直存在了。所以修改了get_object()函式如下:

static A& get_object(){
    static A a;
    return a;
}
這時候就不能用const funciton了,這裡面改變了資料。

第二部分就談談template的基本用法吧,在class裡,我們經常會碰到其中資料都是一個型別,比如前文中說到的complex複數類,這個複數的實部,虛部可以是int,可以是double,等等,這時候利用模板就可以減少重複性的工作:

template<typename T>
class complex{
public:
	complex(T r = 0,T i = 0):re(r),im(i){}
	~complex(){}
	complex& operator += (const complex& rhs);
	T real() const{ return re;}
	T imag() const{ return im;}
private:
	T re,im;
};
使用方式如下所示:
complex<int> c1(1,2);
complex<double> c2(2,3);
從標準庫裡面我們也可以看到比如一個min函式,我們可以寫成如下形式:
template<class T>
inline
const T& min(const T& a,const T& b){
    return a<b?a:b;
}
因為我們有運算子過載,以這樣的min函式來比較所有型別的物件來說,這都是非常合適的,只要我們在對應的class裡進行<的運算子過載,我們就可以定義出我們自己想要的大小比較方式,同時得到最小值,利用T&當然是為了min的多重呼叫,而使用const 是防止min成為左值被使用,這是無意義的。