C++_static與非static成員(函數)

static與非static成員(函數)

 《 C++ Primer》第4版399頁:
對於特定類類型的全體對象而言,訪問一個全局變量有時是必要的。然而,全局變量會破壞封裝:對象須要支持特定類抽象的實現。若是對象是全局的,通常的用戶代碼就能夠修改這個值。
鑑於此,類能夠定義 類靜態成員,而不是定義一個可廣泛訪問的全局對象。
 
一般,非static數據成員存在於類類型的每一個對象中。然而,static數據成員獨立於該類的任意對象而存在
每一個static數據成員是與類關聯的對象而不是與該類的對象相關聯
 
類也能夠定義static成員函數。static成員函數沒有this形參,它能夠直接訪問所屬類的static成員,但不能直接使用非static成員。
注意:類的非static成員函數是能夠直接訪問類的static和非static成員,而不用做用域操做符。
 
使用static成員的優勢:
(1)避免命名衝突:static成員的名字在類的做用域中,所以能夠避免與其餘類的成員或全局對象名字衝突。
(2)能夠實施封裝:static成員能夠是私有成員,而全局對象不能夠。
(3)易讀性:static成員是與特定類關聯的,可顯示程序員的意圖。
 
static成員 與 非static成員調用方法:
非static成員經過對象調用。
static成員經過做用域操做符(直接調用)、對象、引用、指向該類類型對象的指針(間接調用)
class Lunais{
 
static double zty();
double zzz;
 
};
Lunais z;
Lunais *t = &z;
double zty;
 
zty = Lunais::zty();  // static成員經過做用域操做符(直接調用)
zty = z.zty();    //static成員經過對象(簡接調用)
zty = t->zty();   //static成員經過指向該類類型對象的指針(簡接調用)
 
static數據成員定義:
一、通常狀況下,static數據成員是類內聲明,類外定義;
二、static成員不經過類構造函數初始化,而是在定義時進行初始化;
三、一個例外:初始化式爲常量表達式,整型 static  const  數據成員(static  const  int) 能夠在類的定義體內進行初始化:
 
class Lunais{
 
static const int zty = 30;
 
}
值得注意的是:const static數據成員在類的定義體中出始化時,該數據成員仍必須在類的定義體外定義,只是再也不指定初始值:
const int Lunais::zty;
 
常實型 static const數據成員不可在類內初始化。一個好的解決方法是使用宏定義: #define zty 5421 .5421

 

###########################################程序員

如下引自:  http://blog.csdn.net/ljfeng123/article/details/20855515函數

###########################################this

常整型靜態數據成員能夠在類中直接初始化,而常實型靜態數據成員不能夠spa

 class circle
{
int a;                        // 普通變量,不能在類中初始化
static int b;                   // 靜態變量,不能在類中初始化
static const int c=2;               // 靜態常整型變量,能夠在類中初始化
static const double PI=3.1416;//error C2864:    //只有靜態常量整型數據成員才能夠在類中初始化
} ;
 
const int cicle::c ;  //const static數據成員在類的定義體中出始化時,該數據成員仍必須在類的定義體外定義,只是再也不指定初始值
 
b能夠在類外進行初始化,且全部對象共享一個b的值:
int circle::b = 2;
 
double circle::PI = 3.1416;
相關文章
相關標籤/搜索