【C/C++文法外功】類的靜態成員理解

來源:互聯網
上載者:User

例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/

本文著作權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文串連,請尊重作者的勞動成果。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.