例1 孫鑫視頻學習 Oct.27th 2009 Skyseraph
例子1.0
#include "iostream"
class Point
{
public:
void output() {}
static void init() {} //靜態函數,不屬於某個具體的對象,即在未產生Point任何對象時,這個類已經存在於程式的代碼區
}
void main()
{
/*法一
Point pt; //構造對象
pt.init();
pt.output();
*/
//法二
Point::init();/
Point::output();//錯誤
}
說明:法一正確;法二執行錯誤,原因:
//靜態成員函數和靜態成員變數屬於類本身,在類載入的時候,即為它們分配了空間,故可以用類名::函數名或類名:變數名來訪問;
//而非靜態成員函數和非靜態成員屬於對象的方法和資料,也就是應該先產生類的對象,然後通過類的對象去引用。
修改1.1:
class Point
{
public:
void output() {}
static void init() {x=0;y=0;}
private:
int x,y;
}
void main()
{ Point::init();//錯誤:在靜態成員函數中不能調用非靜態成員
}
說明:在靜態成員函數中不能調用非靜態成員(靜態成員函數和靜態成員變數);反之在非靜態成員函數中可以調用靜態成員,可以在修改void output(){ init(); };檢驗
記憶體模型:無論採取什麼樣的操作,程式碼都是在記憶體中執行的,只有在記憶體中佔有一席之地,我們才能訪問它。
修改1.2
在int x,y;前加static,編譯無錯,連結時出錯
說明:對於靜態成員變數,必須對其進行初始化,且必須在類外進行此操作
加上:int Point::x=0;int Point::y=0; OK!
例2 自編小程式 再次理解static Oct28th 2010 skyseraph
#include "iostream"
using namespace std;
class point
{
public:
void point::output1()
{
x1 =0;
x2 =0; //知識點7:非靜態成員函數中可以調用待用資料成員
cout<<"I am not a static member function!"<<endl;
}
static void output2()
{
//y1 =0; //知識點6:靜態成員函數中不可以調用非待用資料成員
//y2 =0; //知識點2:待用資料成員必須初始化,且必須在類外初始化
cout<<"I am a static member function"<<endl;
}
//void output3(int data=x1) {} //知識點5:待用資料成員可以作為成員函數的預設參數,而非靜態成員函數不可以
void output4(int data=x2){}
//static void output() const; //知識點9:靜態成員函數不能使用const關鍵字
//point a1;
static point a2; //知識點4:在定義類成員時,待用資料成員允許定義類的所屬對象,非待用資料成員只能是當前類的指標或參考型別
point *a3;
public:
int y1; //y1=0 基礎:不能直接對類的資料成員初始化
static int y2;
private:
int x1;
static x2;
};
int point::x2=1; //知識點2:待用資料成員必須初始化,且必須在類外初始化
int point::y2=1;
/* //問題:加上這段,編譯始終不能通過,不知什麼地方出現了問題,待議~
void output2() //基礎:對於方法/類的成員函數 的定義可以放在類中或者類外
//知識點8:在定義靜態成員函數時,如果是在類外實現,那麼不能再加static關鍵字
{
//y1 =0; //知識點6:靜態成員函數中不可以調用非待用資料成員
//y2 =0; //知識點2:待用資料成員必須初始化,且必須在類外初始化
cout<<"I am a static member function"<<endl;
}*/
int main(char argc,char** argv)
{
cout<<"通過對象訪問"<<endl;
point a,b;
a.output1();
a.output2();
point*c; //基礎: 待議~~
c->output1();
c->output2();
cout<<"通過類名直接存取"<<endl;
//point::output1(); //知識點1:靜態成員用類名或對象訪問,非靜態成員用對象訪問 //錯誤
point::output2();
//cout<<a.x1<<endl; //基礎:訪問私人類 //錯誤
cout<<a.y2<<endl; //知識點3:類的待用資料成員被所有類的對象共用
//cout<<b.x1<<endl;
cout<<b.y2<<endl;
return -1;
}
SkySeraph Oct.28th 2010 HQU
Author: SKySeraph
Email/GTalk: zgzhaobo@gmail.com QQ:452728574
From: http://www.cnblogs.com/skyseraph/
本文著作權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文串連,請尊重作者的勞動成果。