溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

【C/C++語(yǔ)法外功】類(lèi)的靜態(tài)成員理解

發(fā)布時(shí)間:2020-07-26 19:39:16 來(lái)源:網(wǎng)絡(luò) 閱讀:647 作者:鄒君安 欄目:編程語(yǔ)言

例1  孫鑫視頻學(xué)習(xí)  Oct.27th 2009  Skyseraph

例子1.0

#include "iostream"

class Point

{

public:

void output() {}

static void init() {}  //靜態(tài)函數(shù),不屬于某個(gè)具體的對(duì)象,即在未產(chǎn)生Point任何對(duì)象時(shí),這個(gè)類(lèi)已經(jīng)存在于程序的代碼區(qū)

}

 

void main()

{

/*法一

Point pt; //構(gòu)造對(duì)象

pt.init();

pt.output();

*/

//法二

Point::init();/

Point::output();//錯(cuò)誤

}

說(shuō)明:法一正確;法二執(zhí)行錯(cuò)誤,原因:

//靜態(tài)成員函數(shù)和靜態(tài)成員變量屬于類(lèi)本身,在類(lèi)加載的時(shí)候,即為它們分配了空間,故可以用類(lèi)名::函數(shù)名或類(lèi)名:變量名來(lái)訪問(wèn);

//而非靜態(tài)成員函數(shù)和非靜態(tài)成員屬于對(duì)象的方法和數(shù)據(jù),也就是應(yīng)該先產(chǎn)生類(lèi)的對(duì)象,然后通過(guò)類(lèi)的對(duì)象去引用。

 

修改1.1:

class Point

{

public:

void output() {}

static void init() {x=0;y=0;}

private:

int x,y;

}

void main()

{ Point::init();//錯(cuò)誤:在靜態(tài)成員函數(shù)中不能調(diào)用非靜態(tài)成員

 }

說(shuō)明:在靜態(tài)成員函數(shù)中不能調(diào)用非靜態(tài)成員(靜態(tài)成員函數(shù)和靜態(tài)成員變量);反之在非靜態(tài)成員函數(shù)中可以調(diào)用靜態(tài)成員,可以在修改void output(){ init(); };檢驗(yàn)

內(nèi)存模型:無(wú)論采取什么樣的操作,程序代碼都是在內(nèi)存中執(zhí)行的,只有在內(nèi)存中占有一席之地,我們才能訪問(wèn)它。

 

 

修改1.2

在int x,y;前加static,編譯無(wú)錯(cuò),鏈接時(shí)出錯(cuò)

說(shuō)明:對(duì)于靜態(tài)成員變量,必須對(duì)其進(jìn)行初始化,且必須在類(lèi)外進(jìn)行此操作

加上: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;                                        //知識(shí)點(diǎn)7:非靜態(tài)成員函數(shù)中可以調(diào)用靜態(tài)數(shù)據(jù)成員

cout<<"I am not a static member function!"<<endl;

}

static void output2()

{

//y1 =0;                                //知識(shí)點(diǎn)6:靜態(tài)成員函數(shù)中不可以調(diào)用非靜態(tài)數(shù)據(jù)成員

//y2 =0;                                //知識(shí)點(diǎn)2:靜態(tài)數(shù)據(jù)成員必須初始化,且必須在類(lèi)外初始化

cout<<"I am a static member function"<<endl;

}

//void output3(int data=x1) {} //知識(shí)點(diǎn)5:靜態(tài)數(shù)據(jù)成員可以作為成員函數(shù)的默認(rèn)參數(shù),而非靜態(tài)成員函數(shù)不可以

void output4(int data=x2){}

//static void output() const;  //知識(shí)點(diǎn)9:靜態(tài)成員函數(shù)不能使用const關(guān)鍵字

//point a1;

static point a2; //知識(shí)點(diǎn)4:在定義類(lèi)成員時(shí),靜態(tài)數(shù)據(jù)成員允許定義類(lèi)的所屬對(duì)象,非靜態(tài)數(shù)據(jù)成員只能是當(dāng)前類(lèi)的指針或引用類(lèi)型

point *a3;

public:

int y1; //y1=0  基礎(chǔ):不能直接對(duì)類(lèi)的數(shù)據(jù)成員初始化

static int y2;

private:

int x1;

static x2;

};

int point::x2=1;                                //知識(shí)點(diǎn)2:靜態(tài)數(shù)據(jù)成員必須初始化,且必須在類(lèi)外初始化

int point::y2=1;

/* //問(wèn)題:加上這段,編譯始終不能通過(guò),不知什么地方出現(xiàn)了問(wèn)題,待議~

void output2()   //基礎(chǔ):對(duì)于方法/類(lèi)的成員函數(shù) 的定義可以放在類(lèi)中或者類(lèi)外

//知識(shí)點(diǎn)8:在定義靜態(tài)成員函數(shù)時(shí),如果是在類(lèi)外實(shí)現(xiàn),那么不能再加static關(guān)鍵字

{

//y1 =0;                                //知識(shí)點(diǎn)6:靜態(tài)成員函數(shù)中不可以調(diào)用非靜態(tài)數(shù)據(jù)成員

//y2 =0;                                //知識(shí)點(diǎn)2:靜態(tài)數(shù)據(jù)成員必須初始化,且必須在類(lèi)外初始化

cout<<"I am a static member function"<<endl;

}*/

int main(char argc,char** argv)

{

cout<<"通過(guò)對(duì)象訪問(wèn)"<<endl;

point a,b;

a.output1();

a.output2();

point*c; //基礎(chǔ): 待議~~

c->output1();

c->output2();

cout<<"通過(guò)類(lèi)名直接訪問(wèn)"<<endl;

//point::output1();                        //知識(shí)點(diǎn)1:靜態(tài)成員用類(lèi)名或?qū)ο笤L問(wèn),非靜態(tài)成員用對(duì)象訪問(wèn) //錯(cuò)誤

point::output2();

//cout<<a.x1<<endl; //基礎(chǔ):訪問(wèn)私有類(lèi)  //錯(cuò)誤

cout<<a.y2<<endl;   //知識(shí)點(diǎn)3:類(lèi)的靜態(tài)數(shù)據(jù)成員被所有類(lèi)的對(duì)象共享

//cout<<b.x1<<endl;

cout<<b.y2<<endl;

return -1;

}


向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI