淺談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成爲左值被使用,這是無意義的。
發佈了33 篇原創文章 · 獲贊 16 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章