①static在類的作用域中,可避免同名全局對象衝突.
②可實施封裝,不容易被外部簡單更改其值.
③通過引用方式(區域符::)可清晰表明是與特定類關聯的.
二,定義static成員
①每個類對象都沒有與static數據成員相對應,這個static成員是由整個類類型的全體對象共享,
同一個類的所有對象共用同一個static成員.
②遵循正常的公有/私有訪問規則.
static 類型 name;
static 類型 name();
三,使用類的static成員
①通過 Classobj.member 使用(類對象.成員)
②通過 Classp->menber 使用(類指針->成員)
③通過 Class::member 使用(類::成員)
四,static成員函數
外部定義static成員函數時,無須重複指定static保留字,保留字只出現在類定義體內聲明處:
class A{
public:
//public members
private:
static int fun();
//else private members
};
int A::fun() { .....; }
(因爲 statci 成員是類的組成部分而不是任何對象的組成部分, 所以 static 函數木有 this 指針)
五,static數據成員
※在類的定義體外部進行定義.static數據成員不能通過構造函數進行初始化,應在定義變量時進行初始化.
先指定類型,後接成員的完全限定名.(隨後可沒有限定地直接使用類的數據成員或成員函數)
類型 類::static_mem = value;(value 可以爲類的數據成員或成員函數)
六,特殊的整型 const static 成員
在類的定義體中進行初始化,在類的定義體外進行定義
(ps:類定義時內存並沒有分配空間給static成員,需對static成員進行定義才能使用static成員)
類定義體中:
static const int p = 30;
類定義體外:
const int Class::p ; //不必再製定其初始值
七,static成員不是類對象的組成部分
①static數據成員可以是該成員所屬的類類型.非static成員被限定爲自身類型的指針或引用
②static數據成員可用作默認實參(static成員的值可獨立於類對象使用):
class Bar{
public:
Bar& clear(char = bkground);//默認clear()函數的實參爲char類型的bkground
private:
static const char bkground = '#';
static Bar mem1; //ok.
Bar *mem2; //ok
Bar mem3; //error,不能定義自身類型對象作爲數據成員
};