




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第2章類和對象
面向對象的編程思想類的實現類的使用this指針static關鍵字1、結構化的編程思想
在計算機發展的初期,編寫軟件的主要目的是控制計算機以實現人們想要實現的功能。在這一階段,人們主要是采用功能分解的指導思想。所謂的功能分解,就是將大的功能模塊分解成比較小的功能模塊,然后再將較小的功能模塊分解成更小的功能模塊。
按這一思路,分解到每一小功能模塊可以采用一個函數實現為止。一、面向對象的編程思想
模塊之間的分解關系,在編程實現時體現為函數之間的調用關系。因此,在學習C語言的過程中,大家重點是要掌握函數相關的知識。2、面向對象的編程思想計算機發展到一定階段后,編寫軟件的為模擬實現世界,即將現實生活中的某些現象或場景在計算機中模擬出來。
例如,現實生活中的商店購物過程對應于互聯網的天貓店購物,賽車活動對應于計算機中的賽車游戲等。在計算機中所模擬場景的逼真程度,取決于我們對現實世界的認識程度。
面臨的問題:
怎樣有效地認識現實世界的現象或場景?
唯物辯證法認為:世界是由物質所組成的,并且物質之間存在普遍聯系。
何為物質?物質是指自然界客觀存在的事物,它不以人們的意識為轉移,即不管人們是否看到或意識到某一物質,它都真實存在于自然界。物質---->實體---->對象將唯物辯證法引入到軟件工程領域中,就形成了面向對象的系統分析:被模擬世界是由對象所組成的,對象之間存在普遍聯系。具體應用時,我們可以對這句話進行深入分解,作為我們認識現實世界的指導方針。“被模擬世界是由對象所組成的”可以被分解成三個層次:1、所模擬世界是由哪些對象所組成的?據此,我們可以分析出所有的研究對象。2、每一個對象有哪些狀態?3、每一個對象有哪些行為?通過這兩步的分析,我們可以深入認識每一個研究對象的具體內容。“對象之間存在普遍聯系”也可以被分解成:4、對象之間是否存在組合關系?比如結構上、空間上或邏輯上存在整體與部分的關系。5、對象之間是否滿足現實生活中的分類常識?比如存在一般與特殊的關系或同屬于一大類下的不同子類。6、對象之間是否存在依賴關系,以實現不同對象之間的協作?利用這種面向對象的思維方式,可以讓我們有計劃、有步驟地分析現實世界。針對日常的教學活動(極端簡化版),可以分析很多對象:張三、侯俊杰、C語言、李四、譚浩強、C++語言,…。針對大量的對象,怎樣進行有效的描述或交流?歸納、總結,進行分類處理3、由對象抽象出類通過分類處理,可以發現這些對象都歸屬于學生、教師和課程三種類型之一。好處:不需要面對千千萬萬個內容各異的具體對象,只需要將精力集中在每種類型的共性方面,方便交流。怎樣描述同一類型的數據?C++類中有什么內容?C語言:數據類型、結構體------->C++:類類是什么?在C++語言中,類是一種自定義的數據類型,用來描述同一類對象的屬性與行為。對象狀態行為類成員變量成員函數數據代碼4、對象與類的關系先由現實世界中的對象抽象出類,然后在計算機世界中依據類實例化出相應的對象。5、面向對象編程思想的主要特征1、抽象是對具體對象(問題)進行概括,抽出這一類對象的公共性質并加以描述的過程。=>是指由系統分析所得的各種具體對象,歸納出描述性的類。2、封裝是將抽象出的數據成員、代碼成員相結合,將它們視為一個整體。=>是指利用this指針,將對象的成員函數與成員變量關聯起來。3、繼承是C++中支持層次分類的一種機制,允許程序員在保持原有類特性的基礎上,進行更具體的說明。=>是指利用分類學的原理,優化類的層次結構關系,提高代碼的重用率。4、多態性是同一名稱,不同的功能實現方式。具有重載函數和虛函數兩種實現方式。=>虛函數是構架大型框架與平臺的基礎,是底層框架與上層應用的關聯點。下列術語中,能表明面向對象思想主要特征的是()。封裝性靈活性安全性可靠性ABCD提交單選題1分下列關于類的敘述中,錯誤的是()。類是一種抽象數據類型類是面向對象程序設計的核心類與類之間不能形成層次結構類可以實現對數據的封裝和隱藏ABCD提交可為此題添加文本、圖片、公式等解析,且需將內容全部放在本區域內。正常使用需3.0以上版本類設計之初,就是為了體現面向對象的思想,將有相似屬性和行為的實體抽象為一個類,包含這一類實體的共有屬性和行為,選項A、B正確。類的三大特性:封裝性、繼承性、多態性,選項D正確。類的繼承屬性就能使類形成層次結構,故C選項錯誤,故答案為C選項。答案解析答案解析單選題1分下面關于類和對象說法不正確是()。類由數據與函數組成一個對象必屬于某個類對象是類的實例一個類的對象只有一個ABCD提交單選題1分類是一種復雜的數據類型,它是將不同類型的數據和與這些數據相關的運算封裝在一起的集合體。1、類的定義類將一些數據及與數據相關的函數封裝在一起,使類中的數據得到很好的“保護”。在大型程序中不會被隨意修改。二、類的實現類的定義格式:class類名{private:
成員變量;
成員函數;
public:
成員變量;
成員函數;};關鍵字類名私有公有classStudent{private:charName[20];floatMath;floatChiese;
public:floataverage;
voidSetName(char*name);voidSetMath(floatmath);voidSetChinese(floatch);floatGetAverage(void);};分號不能少用關鍵字priviate限定的成員稱為私有成員對私有成員限定在該類的內部使用私有成員變量只能被該類內的成員函數調用私有成員函數只能被該類內的成員函數調用類就相當于私有成員的作用域。用關鍵字public限定的成員稱為公有成員,公有成員變量或函數不受類的限制,可以在類內或類外自由使用。對類而言是透明的。私有變量公有變量類內函數可以訪問可以訪問類外函數不可訪問可以訪問私有函數公有函數類內函數可以調用可以調用類外函數不可調用可以調用類外類里每一個限制詞(private等)在類體中可使用多次。一旦使用了限制詞,該限制詞一直有效,直到下一個限制詞開始為止。如果未加說明,類中成員默認的訪問權限是private,即私有的。classStudent{ charName[20]; floatMath; floatChiese;
public: floataverage;voidSetName(char*name); voidSetMath(floatmath); voidSetChinese(floatch); floatGetAverage(void);};均為私有權限均為公有權限16.若有如下類定義classFruit{charname[20];public:voidPrint();private:doubleprice;};則下列敘述中,正確的是()。類中有1個公有數據成員類中有1個私有數據成員類中有2個私有數據成員數據成員name的訪問權限未知ABCD提交單選題1分classA{floatx,y;public:
voidSetxy(floata,floatb){x=a;y=b;}voidPrint(void){cout<<x<<‘\t’<<y<<endl;}}; xySetxy()Print()A私有數據公有函數在類外不能直接使用x或y,必須通過Setxy()給x或y賦值,通過Print()輸出x或y。成員函數與成員數據的定義不分先后,可以先說明函數原型,再在類體外定義函數體。classA{floatx,y;public:
voidSetxy(floata,floatb){x=a;y=b;}voidPrint(void){cout<<x<<‘\t’<<y<<endl;}}; 在類體內定義成員函數classA{floatx,y;public:
voidSetxy(floata,floatb);
voidPrint(void);};
voidA::Setxy(floata,floatb){x=a;y=b;}voidA::Print(void){cout<<x<<‘\t’<<y<<endl;}在類體內說明成員函數原型在類體外定義成員函數,需要使用作用域運算符有如下類定義:
classCup{public:voidSetPrice(doubleval);private:doubleprice;};若要在類體外給出對成員函數SetPrice的定義,下列選項中正確的是()。voidCup::SetPrice(doubleval){price=val;}voidCup.SetPrice(doubleval){price=val;}voidSetPrice(doubleval){Cup::price=val;}voidSetPrice(doubleval){Cup.price=val;}ABCD提交單選題1分在定義一個類時,要注意如下幾點:1、類具有封裝性,并且類只是定義了一種結構(樣板),所以類中的任何成員數據均不能使用關鍵字extern,auto或register限定其存儲類型。2、在定義類時,只是定義了一種導出的數據類型,并不為類分配存儲空間,所以,在定義類中的數據成員時,不能對其初始化。如:classTest{intx=5,y=6;//是不允許的
externfloatx; //是不允許的};在C++語言中,結構體類型只是類的一個特例。結構體類型與類的唯一的區別在于:在類中,其成員的缺省的存取權限是私有的;而在結構體類型中,其成員的缺省的存取權限是公有的。2、內聯成員函數當我們定義一個類時,可以在類中直接定義函數體。這時成員函數在編譯時是作為內聯函數來實現的。注意:一定是內聯函數!同時,我們也可以在類體外定義類的內聯成員函數,在類體內說明函數,在類體外定義時,在成員函數的定義前面加上關鍵字inline。classA{floatx,y;public:voidSetxy(floata,floatb);
voidPrint(void);}; inlinevoidA::Setxy(floata,floatb){x=a;y=b;}inlinevoidA::Print(void){cout<<x<<‘\t’<<y<<endl;}說明該成員函數為內聯3、成員函數的重載類中的成員函數與前面介紹的普通函數一樣,成員函數可以帶有缺省的參數,也可以重載成員函數。重載時,函數的形參必須在類型或數目上不同。classTest{ intx,y; intm,n;public:
voidSetxy(inta,intb){x=a; y=b;}
voidSetxy(inta,intb,intc,intd){x=a;y=b;m=c;n=d;}
voidPrintxy(intx){cout<<“m="<<m<<'\t'<<“n="<<n<<endl;}voidPrintxy(void){cout<<"x="<<x<<'\t'<<"y="<<y<<endl;}};voidmain(void){ Testp1,p2;
p1.Setxy(3,5);p2.Setxy(10,20,30,40);//參數不同
p1.Printxy();
p2.Printxy();p2.Printxy(2);//參數、類型不同}輸出:x=3y=5x=10y=20m=30n=404、缺省參數的成員函數classA{floatx,y;public:floatSum(void){returnx+y;}
voidSet(floata,floatb=10.0){x=a; y=b;}voidPrint(void){ cout<<"x="<<x<<'\t'<<"y="<<y<<endl;}};voidmain(void){ Aa1,a2;
a1.Set(2.0,4.0); cout<<"a1:"; a1.Print(); cout<<"a1.sum="<<a1.Sum()<<endl;
a2.Set(20.0); cout<<"a2:"; a2.Print(); cout<<"a2.sum="<<a2.Sum()<<endl;}不缺省參數,a1.x=2,a1.y=4缺省參數,a2.x=20,a2.y=10下列關于類成員函數特性的敘述中,錯誤的是()。成員函數可以遞歸成員函數可以重載成員函數都是內聯函數成員函數可以設置默認參數值ABCD提交單選題1分1、創建對象只有在定義了屬于類的變量后,系統才會為類的變量分配空間。在定義類時,只是定義了一種數據類型,即說明程序中可能會出現該類型的數據,并不為類分配存儲空間。類的變量我們稱之為對象。對象是類的實例,定義對象之前,一定要先說明該對象的類。三、類的使用不同對象占據內存中的不同區域,它們所保存的數據各不相同,但對成員數據進行操作的成員函數的程序代碼均是一樣的。類名對象1,對象2《,......》;Studentst1,st2;對象的定義格式:類名對象名在建立對象時,只為對象分配用于保存數據成員的內存空間,而成員函數的代碼為該類的每一個對象所共享。classA{floatx,y;public:voidSetxy(floata,floatb){x=a;y=b;}voidPrint(void){cout<<x<<‘\t’<<y<<endl;}};Aa1,a2;voidmain(void){Aa3,a4;}定義全局對象定義局部對象成員變量全局變量局部變量2、對象的使用一個對象的成員就是該對象的類所定義的成員,有成員變量和成員函數,引用時同結構體變量類似,用“.”運算符。classA{floatx,y;public:floatm,n;voidSetxy(floata,floatb){x=a;y=b;}voidPrint(void){cout<<x<<‘\t’<<y<<endl;}};voidmain(void){Aa1,a2;//定義對象
a1.m=10;a1.n=20;//為公有成員數據賦值
a1.Setxy(2.0,5.0);//為私有成員數據賦值
a1.Print();}a1nmyxa2nmyx10202.05.0輸出:2 5在類外,用成員選擇運算符“.”只能訪問對象的公有成員,而不能訪問對象的私有成員或保護成員。若要訪問對象的私有的數據成員,只能通過對象的公有成員函數來獲取。classA{floatx,y;public:floatm,n;
voidSetxy(floata,floatb){x=a;y=b;}voidPrint(void){cout<<x<<‘\t’<<y<<endl;}};voidmain(void){Aa1,a2;a1.m=10;a1.n=20; //為公有成員數據賦值
a1.x=2;a1.y=5;
a1.Setxy(2.0,5.0);
a1.Print();}必須通過類內公有函數訪問私有數據成員非法,私有成員不能在類外訪問同類型的對象之間可以整體賦值,這種賦值與對象的成員的訪問權限無關。classA{floatx,y;public:floatm,n;voidSetxy(floata,floatb){x=a;y=b;}voidPrint(void){cout<<x<<‘\t’<<y<<endl;}};voidmain(void){Aa1,a2;a1.m=10;a1.n=20; //為公有成員數據賦值
a1.Setxy(2.0,5.0);
a2=a1;a1.Print();a2.Print();}同類型的對象之間可以整體賦值相當于成員變量間相互賦值對象可以作函數的入口參數(實參、形參),也可以作函數的出口參數。這與一般變量作為函數的參數是完全相同的。可以定義類類型的指針,類類型的引用,對象數組,指向類類型的指針數組和指向一維或多維數組的指針變量一個類的對象,可作為另一個類的成員類體的區域稱為類作用域。類的成員函數與成員數據,其作用域都是屬于類的作用域,僅在該類的范圍內有效,故不能在主函數中直接通過函數名和成員名來調用函數。3、類作用域和對象的作用域對象的作用域與前面介紹的變量作用域完全相同,全局對象、局部對象、局部靜態對象等。classA{floatx,y;public:floatm,n;voidSetxy(floata,floatb){x=a;y=b;}voidPrint(void){cout<<x<<‘\t’<<y<<endl;}};voidmain(void){Aa1,a2;a1.m=20;a1.n=10;
a1.Setxy(2.0,5.0);
a1.Print();}voidmain(void){Aa1,a2;
m=20;n=10;
Setxy(2.0,5.0);
Print();
}用對象名調用不能直接調用classA{floatx,y;public:floatm,n;voidSetxy(floata,floatb){x=a;y=b;}//成員函數voidPrint(void){cout<<x<<‘\t’<<y<<endl;}//成員函數};voidmain(void)//全局函數{Aa1,a2;a1.m=20;a1.n=10;
a1.Setxy(2.0,5.0);
a1.Print();}成員函數:局部變量-->成員變量-->全局變量全局函數:局部變量-->全局變量4、類的對象如何引用私有成員變量1)通過公有函數為私有成員賦值classTest{ intx,y;public:
voidSetxy(inta,intb){x=a; y=b;}voidPrintxy(void){cout<<"x="<<x<<'\t'<<"y="<<y<<endl;}};voidmain(void){ Testp1,p2;
p1.Setxy(3,5);
p1.Printxy();}調用公有函數為私有對象賦值2)利用函數訪問私有數據成員classTest{intx,y;public:voidSetxy(inta,intb){x=a; y=b;}intGetx(void){returnx;}//返回x值
intGety(void){returny;}//返回y值
voidPrintxy(void){cout<<"x="<<x<<'\t'<<"y="<<y<<endl;}};voidmain(void){Testp1,p2;p1.Setxy(3,5);inta,b;
a=p1.Getx();b=p1.Gety();//將a=x,b=ycout<<a<<'\t'<<b<<endl;}函數值就是私有成員變量的值3)利用指針訪問私有數據成員classTest{intx,y;public:voidSetxy(inta,intb){x=a; y=b;}
voidGetxy(int*px,int*py){*px=x;*py=y;}//提取x,y值
voidPrintxy(void){cout<<"x="<<x<<'\t'<<"y="<<y<<endl;}};voidmain(void){Testp1,p2;p1.Setxy(3,5);inta,b;p1.Getxy(&a,&b);//將a=x,b=ycout<<a<<'\t'<<b<<endl;}輸出:3 54)利用引用訪問私有數據成員classTest{ intx,y;public:voidSetxy(inta,intb){ x=a;y=b;}
voidGetxy(int&px,int&py){px=x; py=y; }//提取x,y值
voidPrintxy(void){cout<<"x="<<x<<'\t'<<"y="<<y<<endl;}};voidmain(void){Testp1,p2;p1.Setxy(3,5);inta,b;p1.Getxy(a,b);//將a=x,b=ycout<<a<<'\t'<<b<<endl;}輸出:3 5類引用舉例(三角形類:三角形的三邊及與三邊相關的運算)classTriangle{private: floata,b,c;//三邊為私有成員數據public: voidSetabc(floatx,floaty,floatz);//置三邊的值
voidGetabc(float&x,float&y,float&z);//取三邊的值
floatPerimeter(void);//計算三角形的周長
floatArea(void);//計算三角形的面積
voidPrint(void);//打印相關信息};voidTriangle::Setabc(floatx,floaty,floatz){a=x;b=y;c=z;}//置三邊的值voidTriangle::Getabc(float&x,float&y,float&z)//取三邊的值
{x=a;y=b;z=c;}floatTriangle::Perimeter(void){return(a+b+c)/2;}//計算三角形的半周長floatTriangle::Area(void)//計算三角形的面積{floatarea,p;p=Perimeter();area=sqrt((p-a)*(p-b)*(p-c)*p);//海倫公式returnarea;}voidTriangle::Print(void)//打印相關信息{cout<<"Peri="<<Perimeter()<<'\t'<<"Area="<<Area()<<endl;}voidmain(void){ TriangleTri1; //定義三角形類的一個實例(對象)
Tri1.Setabc(4,5,6); //為三邊置初值
floatx,y,z; Tri1.Getabc(x,y,z);//將三邊的值為x,y,z賦值
cout<<x<<'\t'<<y<<'\t'<<z<<endl; cout<<“s=”<<Tri1.Perimeter()<<endl;//求三角形的周長
cout<<“Area=”<<Tri1.Area()<<endl;//求三角形的面積
cout<<"Tri1:"<<endl; Tri1.Print();//打印有關信息}類引用舉例(學生類:學生的姓名成績及相關的運算)classStudent{ charName[20]; //學生姓名
floatChinese; //語文成績
floatMath; //數學成績public:floatAverage(void);//計算平均成績
floatSum(void); //計算總分
voidShow(void); //打印信息
voidSetStudent(char*,float,float);//為對象置姓名、成績
voidSetName(char*); //為對象置姓名
char*GetName(void); //取得學生姓名};floatStudent::Average(void){return(Chinese+Math)/2;}//平均成績floatStudent::Sum(void){returnChinese+Math;}//總分voidStudent::Show(void) //打印信息{cout<<"Name:"<<Name<<endl<<"Score:"<<Chinese<<'\t'<<Math<<'\t'<<"average:"<<Average()<<'\t'<<"Sum:"<<Sum()<<endl;}voidStudent::SetStudent(char*name,floatchinese,floatmath){ strcpy(Name,name); //置姓名
Chinese=chinese; //置語文成績
Math=math; //置數學成績}char*Student::GetName(void){returnName;}//返回姓名voidmain(void){ Studentp1,p2;p1.SetStudent(“Liqing”,98,96);//對象置初值p2.SetStudent("WangGang",90,88);//對象置初值p1.Show();//打印信息p2.Show();//打印信息p1.SetName(“Zhaojian”);//重新置p1對象的名字p1.Show();cout<<“p1.Name:”<<p1.GetName()<<endl;//打印對象的名字cout<<“p1.average:”<<p1.Average()<<endl;//打印對象的成績}575、定義類的指針及如何用指針來引用對象classA{ floatx,y;public: floatSum(void){returnx+y;} voidSet(floata,floatb){x=a; y=b;}voidPrint(void){ cout<<"x="<<x<<'\t'<<"y="<<y<<endl;}};voidmain(void){Aa1,a2;A*p; //定義類的指針
p=&a1; //給指針賦值
p->Set(2.0,3.0);//通過指針引用對象的成員函數
p->Print();cout<<p->Sum()<<endl;a2.Set(10.0,20.0);a2.Print();}xy2.03.0pa1定義類的數組及數組中元素的引用voidmain(void){
Stustu[3]; //定義類的數組
Stu*pstu; //定義類的指針
pstu=stu; //為指針賦值
inti;
stu[0].SetStudent(“A”,90,90);//通過數組元素的引用賦值
stu[1].SetStudent("B",80,80); stu[2].SetStudent("C",70,70); for(i=0;i<3;i++) {
pstu->Show();//指針變量指向數組元素
pstu++; //指針變量加一,指向下一元素
}}stupstupstu四、this指針不同對象占據內存中的不同區域,它們所保存的數據各不相同,但對成員變量進行操作的成員函數的程序代碼均是一樣的。classA{intx,y;public:voidSetxy(inta,intb){x=a;y=b;}};Aa1,a2;1a1.x2a1.y3a2.x4a2.y......x=a;y=b;......a1.Setxy()a2.Setxy()a1.Setxy(1,2);a2.Setxy(3,4);this->x=a;this->y=b;系統自動將對象的指針帶到成員函數中當對一個對象調用成員函數時,編譯程序先將對象的地址賦給this指針,然后調用成員函數,每次成員函數存取數據成員時,也隱含使用this指針。this指針具有如下形式的缺省說明:
Student*constthis;類名即this指針里的地址是一個常量源代碼:classA{intx,y;public:voidSetxy(inta,intb){x=a;y=b;}};Aa1;a1.Setxy(1,2);編譯后的代碼:classA{intx,y;public:voidSetxy(inta,intb,
A
*const
this){this->x=a;this->y=b;}};Aa1;a1.Setxy(1,2,&a1);由此可知,對對象的成員進行訪問或調用時,都是依據對象來進行的:顯式的形式:對象.成員或指針->成員隱式的形式:this->成員下列關于this指針的敘述中,錯誤的是()。this指針只能在類的非靜態成員函數中使用this指針存儲著對象的地址this指針不需要顯式定義在構造函數中不能使用this指針ABCD提交單選題1分什么是封裝?怎樣理解封裝?在面向對象的編程語言中,一個對象的成員變量和成員函數是一個邏輯統一體。即這個對象的成員函數可以直接訪問對象的成員變量或直接調用對象的成員函數。classA{intx,y;public:voidSetxy(inta,intb)//對象的成員函數{
x=a;
//成員函數直接訪問成員變量
y=b;}};封裝是通過成員函數中的this指針來實現。在編譯過程中,編譯器會自動為成員函數中的成員變量增加一個this指針,以實現對成員變量的訪問。classA{intx,y;public:voidSetxy(inta,intb,
A
*const
this){this->x=a;
this->y=b;}};總結一句話:在面向對象的語言中,對象的成員要通過對象來訪問!
通常,每當說明一個對象時,把該類中的有關成員數據拷貝到該對象中,即同一類的不同對象,其成員數據之間是互相獨立的。因此,我們通常也稱之為對象成員變量。classA{intx,y;public:voidSetxy(inta,intb){x=a;y=b;}};Aa1,a2;a1.xa1.ya2.xa2.y......x=a;y=b;......a1.Setxy()a2.Setxy()a1.Setxy(1,2);a2.Setxy(3,4);this->x=a;this->y=b;四、static關鍵字四、static關鍵字1、靜態成員變量如果要在同一類的多個對象之間實現數據共享,則可使用該類的靜態成員變量,即由同一類的所有對象共享該類的靜態成員變量。這樣的做法可避免使用全局變量所帶來的危險。對象1…對象n同類型多個對象靜態成員變量共享同一個靜態在員變量概念在類中,用關鍵字static修飾的成員變量稱為靜態成員變量。classA{intx,y;staticintz;public:voidSetxy(inta,intb){x=a;y=b;}};Aa1,
a2;a1.xa1.ya2.xa2.yza1.za2.z不同對象,同一空間四、static關鍵字classCounter{
staticintcount; //用于表示已建立的對象數目
intobjnum; //用于表示對象序號public:Counter(){count++;//每建立一個對象就加一
objnum=count;//為當前對象序號賦值
}voidshow(){cout<<“objid:"<<objnum<<"created"<<endl;cout<<“totally:“<<count<<"objects“<<endl;}};intCounter::count=0;//在類體之外進行初始化1、在成員變量前使用static關鍵字2、必須在類體之外進行初始化,此時要數據類型,但不要static關鍵字實現四、static關鍵字方式一:靜態成員變量為類所有,因此可以通過類名來進行訪問。形式為:
類名::靜態成員變量cout<<Counter::count<<endl;方式二:靜態成員變量為此類所有對象所共享,因此也可以是通過對象訪問。形式為:
對象.靜態成員變量voidshow(){cout<<“objid:"<<objnum<<"created"<<endl;cout<<“totally:“<<count<<"objects“<<endl;}使用方式四、static關鍵字1、靜態成員變量屬于類,也可以說是屬于此類的所有對象,而不是屬于該類的某一個對象。靜態成員變量的生命周期是整個程序,而其作用域是它被定義時所在的類。因此,也稱為類成員。非靜態成員變量的生命周期與其對象同在,而其作用域是它被定義時所在的類。因此,也稱為對象成員。注意事項732、類的靜態數據成員是靜態分配存儲空間的,而其它成員是動態分配存儲空間的(全局變量除外)。對于對象成員變量,只有在程序執行期間遇到創建類對象的語句時,才為對象的所有成員依次分配存儲空間,這種存儲空間的分配是動態的;對于類成員變量,在編譯時,就要為類的靜態數據成員分配存儲空間。因此,必須在實現文件中,對靜態數據成員作一次且只能作一次定義性說明。classA{staticintx;//定義靜態成員};intA::x=0;//必須對靜態成員作一次定義性說明743、靜態數據成員具有全局變量和局部變量的一些特性。靜態數據成員與全局變量一樣都是靜態分配存儲空間的。全局變量在程序中的任何位置都可以訪問它,而靜態數據成員受到訪問權限的約束。必須是public權限時,才可能在類外進行訪問。2、靜態成員函數可以將成員函數定義為靜態的成員函數,即使用關鍵字static來修飾成員函數。classA{floatx,y;public:A(){}staticvoidsum(void){.....}};在類內定義靜態成員函數76classTc{private:intA;
staticintB;//靜態數據成員public:Tc(inta){A=a;B+=a;}
staticvoiddisplay(Tcc);//Tc的對象為形參};voidTc::display(Tcc)//不用static修飾{cout<<"A="<<c.A<<",B="<<B<<endl;}1、在類內聲明靜態成員函數2、在類外實現靜態成員函數,不需要使用static關鍵字77對靜態成員函數的
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年院線經營合作協議書
- 2025年柔性樹脂版合作協議書
- 農戶農業機械購置與技術服務協議
- 2025年深孔鉆項目合作計劃書
- 行業資質榮譽證書復印件證明書(5篇)
- 小學教師節班會活動方案
- 個人收入及獎金津貼補助證明(8篇)
- 基礎與地基設計試題及答案
- 電子交易市場入駐商家協議
- 人力資源管理市政學試題及答案
- MOOC 跨文化交際通識通論-揚州大學 中國大學慕課答案
- 防溺水大家訪記錄表
- 人教版八年級下英語單詞默寫表格(整理打印)
- FMEA第五版(實例2)
- 量表開發與檢驗(課堂PPT)
- IABP知情同意書
- 煉鐵廠魚雷罐、鐵水罐穿包緊急預案
- 涉密測繪成果保密檢查情況記錄表
- 《電路分析基礎》試題及答案
- 重介質旋流器選煤畢業設計說明書
- 電氣設備調試定額
評論
0/150
提交評論