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數據成員定義:
1、一般情況下,static數據成員是類內聲明,類外定義;
2、static成員不通過類構造函數初始化,而是在定義時進行初始化;
3、一個例外:初始化式為常量表達式,整型
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
###########################################
常整型靜態數據成員可以在類中直接初始化,而常實型靜態數據成員不可以
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;
