淺談static、類模板和函式模板
阿新 • • 發佈:2019-02-03
首先,我們先來看static,從C語言我們知道,他是一個靜態變數的識別符號,可以讓一個變數在離開作用域後,還能夠存活。那麼如果我們在類當中定義了一個static資料會怎麼樣,這個static資料會在程式開始前就會存在,而且僅此一份。那麼static function呢,簡而言之就是,操縱static變數的函式,舉個例子,現在我們要計算一個基金增長利率,那麼這個利率對於所有的物件來說,都是一樣的,那麼把它宣告為static變數會更有效率以及更節省空間。
進一步來說,在Singleton(單體)設計模式中,我們可以知道一個class就只存在一個物件,那麼這個物件就是static的,為了讓別人無法建立物件,我們需要把建構函式,拷貝建構函式放入private中,通過一個函式介面來獲得這個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; }
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成為左值被使用,這是無意義的。