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數據成員定義:
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;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM