首先,我們先來看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成爲左值被使用,這是無意義的。