C++備課講義第11章_第1頁
C++備課講義第11章_第2頁
C++備課講義第11章_第3頁
C++備課講義第11章_第4頁
C++備課講義第11章_第5頁
已閱讀5頁,還剩28頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、1第第11章章 靜態(tài)成員與友元靜態(tài)成員與友元 2 通常,每當(dāng)說明一個對象時,把該類中的有關(guān)成員通常,每當(dāng)說明一個對象時,把該類中的有關(guān)成員數(shù)據(jù)拷貝到該對象中,即同一類的不同對象,數(shù)據(jù)拷貝到該對象中,即同一類的不同對象,其成員數(shù)據(jù)其成員數(shù)據(jù)之間是互相獨(dú)立的之間是互相獨(dú)立的。靜態(tài)成員靜態(tài)成員 class A int x,y; public: void Setxy(int a, int b) x=a; y=b;A a1, 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;

2、this-y=b;3當(dāng)我們將類的某一個當(dāng)我們將類的某一個數(shù)據(jù)成員的存儲類型指定為靜態(tài)類型數(shù)據(jù)成員的存儲類型指定為靜態(tài)類型時時,則由該類所產(chǎn)生的所有對象,其靜態(tài)成員均共享,則由該類所產(chǎn)生的所有對象,其靜態(tài)成員均共享一個一個存儲空間存儲空間,這個空間是在編譯的時候分配的這個空間是在編譯的時候分配的。換言之,在。換言之,在說明對象時,并不為靜態(tài)類型的成員分配空間。說明對象時,并不為靜態(tài)類型的成員分配空間。 在類定義中,用關(guān)鍵字在類定義中,用關(guān)鍵字static修飾的數(shù)據(jù)成員稱為靜修飾的數(shù)據(jù)成員稱為靜態(tài)數(shù)據(jù)成員。態(tài)數(shù)據(jù)成員。class A int x,y; static int z; public: v

3、oid Setxy(int a, int b) x=a; y=b;A a1, a2;a1.xa1.ya2.xa2.yza1. za2. z不同對象,同一空間不同對象,同一空間4有關(guān)靜態(tài)數(shù)據(jù)成員的使用,說明以下幾點(diǎn):有關(guān)靜態(tài)數(shù)據(jù)成員的使用,說明以下幾點(diǎn):1、類的靜態(tài)數(shù)據(jù)成員是、類的靜態(tài)數(shù)據(jù)成員是靜態(tài)分配存儲空間靜態(tài)分配存儲空間的,而其它成員是動態(tài)分配存儲空間的(全的,而其它成員是動態(tài)分配存儲空間的(全局變量除外)。當(dāng)類中沒有定義靜態(tài)數(shù)據(jù)成局變量除外)。當(dāng)類中沒有定義靜態(tài)數(shù)據(jù)成員時,在程序執(zhí)行期間遇到說明類的對象時,員時,在程序執(zhí)行期間遇到說明類的對象時,才為對象的所有成員依次分配存儲空間,這才為

4、對象的所有成員依次分配存儲空間,這種存儲空間的分配是動態(tài)的;種存儲空間的分配是動態(tài)的;而當(dāng)類中定義而當(dāng)類中定義了靜態(tài)數(shù)據(jù)成員時,了靜態(tài)數(shù)據(jù)成員時,在編譯時,就要為類的在編譯時,就要為類的靜態(tài)數(shù)據(jù)成員分配存儲空間靜態(tài)數(shù)據(jù)成員分配存儲空間。52、必須在文件作用域中,對靜態(tài)數(shù)據(jù)成員作必須在文件作用域中,對靜態(tài)數(shù)據(jù)成員作一次且只能作一次定義性說明一次且只能作一次定義性說明。因為靜態(tài)數(shù)。因為靜態(tài)數(shù)據(jù)成員在定義性說明時已分配了存儲空間,據(jù)成員在定義性說明時已分配了存儲空間,所以通過靜態(tài)數(shù)據(jù)成員名前加上所以通過靜態(tài)數(shù)據(jù)成員名前加上類名和作用類名和作用域運(yùn)算符域運(yùn)算符,可直接引用靜態(tài)數(shù)據(jù)成員。在,可直接引用靜

5、態(tài)數(shù)據(jù)成員。在C+中,靜態(tài)變量缺省的初值為中,靜態(tài)變量缺省的初值為0,所以靜態(tài),所以靜態(tài)數(shù)據(jù)成員總有唯一的初值。當(dāng)然,數(shù)據(jù)成員總有唯一的初值。當(dāng)然,在對靜態(tài)在對靜態(tài)數(shù)據(jù)成員作定義性的說明時,數(shù)據(jù)成員作定義性的說明時,也可以指定一也可以指定一個初值。個初值。6class Aint i,j;static int x,y;/定義靜態(tài)成員定義靜態(tài)成員public: A(int a=0,int b=0,int c=0, int d=0)i=a;j=b;x=c;y=d;void Show()cout i=itj=jt; cout x=xty=yn; ;int A:x=0; /必須對靜態(tài)成員作一次定義性說明

6、必須對靜態(tài)成員作一次定義性說明 int A:y=0; void main(void )A a(2,3,4,5);a.Show();A b(100,200,300,400);b.Show();a.Show();a.x 和和b.x在內(nèi)存中占據(jù)一個空間在內(nèi)存中占據(jù)一個空間a.y 和和b.y在內(nèi)存中占據(jù)一個空間在內(nèi)存中占據(jù)一個空間i=2j=3x=4y=5i=100 j=200 x=300 y=400i=2j=3x=300 y=4007class Aint i,j;public: static int x;public: A(int a=0,int b=0,int c=0) i=a ; j=b ; x=

7、c; void Show()cout i=itj=jt;cout x=xn;int A:x=500; /int A:x;void main(void )A a(20,40,10),b(30,50,100);a.Show ();b.Show ();cout “A:x=”A:xn; /可以直接用類名引用可以直接用類名引用在類外重新定義在類外重新定義83、靜態(tài)數(shù)據(jù)成員具有全局變量和局部變量的一些、靜態(tài)數(shù)據(jù)成員具有全局變量和局部變量的一些特性。靜態(tài)數(shù)據(jù)成員與全局變量一樣都是靜態(tài)分特性。靜態(tài)數(shù)據(jù)成員與全局變量一樣都是靜態(tài)分配存儲空間的,配存儲空間的,但全局變量在程序中的任何位置但全局變量在程序中的任何位

8、置都可以訪問它,而靜態(tài)數(shù)據(jù)成員受到訪問權(quán)限的都可以訪問它,而靜態(tài)數(shù)據(jù)成員受到訪問權(quán)限的約束。約束。必須是必須是public權(quán)限時,才可能在類外進(jìn)行訪權(quán)限時,才可能在類外進(jìn)行訪問問。4、為了保持靜態(tài)數(shù)據(jù)成員取值的一致性,通常在、為了保持靜態(tài)數(shù)據(jù)成員取值的一致性,通常在構(gòu)造函數(shù)中不給靜態(tài)數(shù)據(jù)成員置初值,構(gòu)造函數(shù)中不給靜態(tài)數(shù)據(jù)成員置初值,而是在對而是在對靜態(tài)數(shù)據(jù)成員的定義性說明時指定初值靜態(tài)數(shù)據(jù)成員的定義性說明時指定初值。 9class Aint i;static int count;public:A(int a=0) i=a; count+; cout Number of Objects=coun

9、tn; A() count-; cout Number of Objects=countn; void Show() cout i=in; cout count=countn;int A:count;void main(void )A a1(100);A b2;a1.Show();Number of Objects=1Number of Objects=2Number of Objects=3i=100count=3Number of Objects=2Number of Objects=1Number of Objects=010靜態(tài)成員函數(shù)靜態(tài)成員函數(shù)可以將類的成員函數(shù)定義為靜態(tài)的成員函數(shù)

10、。即可以將類的成員函數(shù)定義為靜態(tài)的成員函數(shù)。即使用關(guān)鍵字使用關(guān)鍵字static來修飾成員函數(shù)來修飾成員函數(shù) 。class A float x, y;public : A( ) static void sum(void) . ;11對靜態(tài)成員函數(shù)的用法說明以下幾點(diǎn):對靜態(tài)成員函數(shù)的用法說明以下幾點(diǎn):1、與靜態(tài)數(shù)據(jù)成員一樣,在類外的程序代碼中,與靜態(tài)數(shù)據(jù)成員一樣,在類外的程序代碼中,通過類名加上作用域操作符,可直接調(diào)用靜態(tài)成通過類名加上作用域操作符,可直接調(diào)用靜態(tài)成員函數(shù)員函數(shù)。 2、靜態(tài)成員函數(shù)只能直接使用本類的靜態(tài)數(shù)據(jù)成靜態(tài)成員函數(shù)只能直接使用本類的靜態(tài)數(shù)據(jù)成員或靜態(tài)成員函數(shù)員或靜態(tài)成員函數(shù),

11、但不能直接使用非靜態(tài)的數(shù)但不能直接使用非靜態(tài)的數(shù)據(jù)成員據(jù)成員 (可以引用使用)。這是因為靜態(tài)成員函(可以引用使用)。這是因為靜態(tài)成員函數(shù)可被其它程序代碼直接調(diào)用,所以,數(shù)可被其它程序代碼直接調(diào)用,所以,它不包含它不包含對象地址的對象地址的this指針指針。 12class Tc private:int A;static int B;/靜態(tài)數(shù)據(jù)成員靜態(tài)數(shù)據(jù)成員public:Tc(int a)A=a; B+=a;static void display(Tc c)/Tc的對象為形參的對象為形參 coutA=c.A,B=Bendl;int Tc:B=2;void main(void)Tc a(2),b

12、(4);Tc:display (a);Tc:display (b);非靜態(tài)成員,用非靜態(tài)成員,用對象名來引用對象名來引用靜態(tài)成員,靜態(tài)成員,直接引用直接引用直接用類名來調(diào)用直接用類名來調(diào)用靜態(tài)成員函數(shù)靜態(tài)成員函數(shù)A=2,B=8A=4,B=8133、靜態(tài)成員函數(shù)的實現(xiàn)部分在類定義之外定義時,靜態(tài)成員函數(shù)的實現(xiàn)部分在類定義之外定義時,其前面不能加修飾詞其前面不能加修飾詞static。這是由于關(guān)鍵字。這是由于關(guān)鍵字static不是數(shù)據(jù)類型的組成部分不是數(shù)據(jù)類型的組成部分,因此,在類外定義靜態(tài)因此,在類外定義靜態(tài)成員函數(shù)的實現(xiàn)部分時成員函數(shù)的實現(xiàn)部分時,不能使用這個關(guān)鍵字不能使用這個關(guān)鍵字4、不能把靜

13、態(tài)成員函數(shù)定義為虛函數(shù)不能把靜態(tài)成員函數(shù)定義為虛函數(shù)。靜態(tài)成員。靜態(tài)成員函數(shù)也是在編譯時分配存儲空間,所以在程序的函數(shù)也是在編譯時分配存儲空間,所以在程序的執(zhí)行過程中不能提供多態(tài)性。執(zhí)行過程中不能提供多態(tài)性。5、可將靜態(tài)成員函數(shù)定義為內(nèi)聯(lián)的(可將靜態(tài)成員函數(shù)定義為內(nèi)聯(lián)的(inline),其,其定義方法與非靜態(tài)成員函數(shù)完全相同。定義方法與非靜態(tài)成員函數(shù)完全相同。14class Tc private:int A;static int B;/靜態(tài)數(shù)據(jù)成員靜態(tài)數(shù)據(jù)成員public:Tc(int a)A=a; B+=a;static void display(Tc c);/Tc的對象為形參的對象為形參;

14、void Tc:display(Tc c)/不用不用static修飾修飾 coutA=c.A,B=Bendl;int Tc:B=2;void main(void)Tc a(2),b(4);Tc:display (a);Tc:display (b);函數(shù)原型函數(shù)原型類外定義類外定義159. 下述程序的輸出結(jié)果是下述程序的輸出結(jié)果是_。class Apublic: static int s; A()s+; A() ; void SetValue(int );int A:s;void A:SetValue(int val) s = val; void main() A a3, *p; p = a;

15、for(int k = 0; k SetValue(k+1); p+; cout A:s endl;316#includeclass Tcprivate: int m_a; static int m_b;public: Tc(int a)m_a=a; m_b+=a; void display() cout a= m_a t b= m_b endl; ;int Tc:m_b=2;void main() Tc c1(2),c2(4); c1.display(); c2.display();該程序的輸出結(jié)果為該程序的輸出結(jié)果為_a=2 b=8a=4 b=817友元函數(shù)友元函數(shù)類中私有和保護(hù)的成員在類

16、外不能被訪問。類中私有和保護(hù)的成員在類外不能被訪問。友元函數(shù)是一種定義在類外部的友元函數(shù)是一種定義在類外部的普通函普通函數(shù)數(shù),其特點(diǎn)是,其特點(diǎn)是能夠訪問類中私有成員和能夠訪問類中私有成員和保護(hù)成員保護(hù)成員,即類的訪問權(quán)限的限制對其,即類的訪問權(quán)限的限制對其不起作用。不起作用。18友元函數(shù)需要在友元函數(shù)需要在類體內(nèi)類體內(nèi)進(jìn)行說明,在前面加進(jìn)行說明,在前面加上關(guān)鍵字上關(guān)鍵字friend。一般格式為:一般格式為:friend FuncName();friend float Volume(A &a);關(guān)鍵字關(guān)鍵字返回值類型返回值類型函數(shù)名函數(shù)名函數(shù)參數(shù)函數(shù)參數(shù)19友元函數(shù)不是成員函數(shù)友元函數(shù)不是成員函

17、數(shù),用法也與普通,用法也與普通的函數(shù)完全一致,的函數(shù)完全一致,只不過它能訪問類中只不過它能訪問類中所有的數(shù)據(jù)所有的數(shù)據(jù)。友元函數(shù)破壞了類的封裝友元函數(shù)破壞了類的封裝性和隱蔽性,使得非成員函數(shù)可以訪問性和隱蔽性,使得非成員函數(shù)可以訪問類的私有成員類的私有成員。一個類的友元可以自由地用該類中的所有成員。一個類的友元可以自由地用該類中的所有成員。20class Afloat x,y;public: A(float a, float b) x=a; y=b; float Sum() return x+y; friend float Sum(A &a) return a.x+a.y; ;void mai

18、n(void) A t1(4,5),t2(10,20); coutt1.Sum()endl; coutSum(t2)endl;友元函數(shù)友元函數(shù)成員函數(shù)成員函數(shù)友元函數(shù)的調(diào)用,直接調(diào)用友元函數(shù)的調(diào)用,直接調(diào)用成員函數(shù)的調(diào)用,利用對象名調(diào)用成員函數(shù)的調(diào)用,利用對象名調(diào)用友元函數(shù)只能用友元函數(shù)只能用對象對象名名引用類中的數(shù)據(jù)。引用類中的數(shù)據(jù)。私有數(shù)據(jù)私有數(shù)據(jù)21有關(guān)友元函數(shù)的使用,說明如下:有關(guān)友元函數(shù)的使用,說明如下:友元函數(shù)不是類的成員函數(shù)友元函數(shù)不是類的成員函數(shù)友元函數(shù)近似于友元函數(shù)近似于普通的函數(shù)普通的函數(shù),它不帶有,它不帶有this指針,指針,因此必須將對象名或?qū)ο蟮囊米鳛橐虼吮仨殞ο?/p>

19、名或?qū)ο蟮囊米鳛橛言瘮?shù)的參數(shù)友元函數(shù)的參數(shù),這樣才能訪問到對象的成,這樣才能訪問到對象的成員。員。22友元函數(shù)與一般函數(shù)的不同點(diǎn)在于友元函數(shù)與一般函數(shù)的不同點(diǎn)在于: 友元函數(shù)必須在類的定義中說明,友元函數(shù)必須在類的定義中說明,其其函數(shù)體可在類內(nèi)定義,也可在類外定函數(shù)體可在類內(nèi)定義,也可在類外定義義;1.它可以訪問該類中的所有成員(公有它可以訪問該類中的所有成員(公有的、私有的和保護(hù)的)的、私有的和保護(hù)的),而一般函數(shù),而一般函數(shù)只能訪問類中的公有成員。只能訪問類中的公有成員。23class Afloat x,y;public: A(float a, float b) x=a; y=b; f

20、loat Getx() return x; float Gety() return y; float Sum() return x+y; friend float Sum(A &); ;float Sumxy(A &a) return a.Getx()+a.Gety(); float Sum(A &a) return a.x+a.y; void main(void) A t1(1,2),t2(10,20), t3(100,200); coutt1.Sum()endl; coutSum(t2)endl; coutSumxy(t3)endl;成員函數(shù)成員函數(shù)友元函數(shù)友元函數(shù),可以直接調(diào)用類中私有成

21、員可以直接調(diào)用類中私有成員普通函數(shù),必須通過公有函數(shù)訪問私有成員普通函數(shù),必須通過公有函數(shù)訪問私有成員對象調(diào)用成員函數(shù)對象調(diào)用成員函數(shù)調(diào)用友元函數(shù)調(diào)用友元函數(shù)調(diào)用一般函數(shù)調(diào)用一般函數(shù)友元函數(shù)友元函數(shù)24友元函數(shù)不受類中訪問權(quán)限關(guān)鍵字的限制,可以友元函數(shù)不受類中訪問權(quán)限關(guān)鍵字的限制,可以把它放在類的私有部分,放在類的公有部分或放把它放在類的私有部分,放在類的公有部分或放在類的保護(hù)部分,其作用都是一樣的。換言之,在類的保護(hù)部分,其作用都是一樣的。換言之,在類中對友元函數(shù)指定訪問權(quán)限是不起作用的在類中對友元函數(shù)指定訪問權(quán)限是不起作用的。友元函數(shù)的作用域與一般函數(shù)的作用域相同。友元函數(shù)的作用域與一般函

22、數(shù)的作用域相同。謹(jǐn)慎使用友元函數(shù)謹(jǐn)慎使用友元函數(shù)通常使用友元函數(shù)來通常使用友元函數(shù)來取取對象中的數(shù)據(jù)成員值,而對象中的數(shù)據(jù)成員值,而不修改不修改對象中的成員值,則肯定是安全的。對象中的成員值,則肯定是安全的。25大多數(shù)情況是友元函數(shù)是某個類的成員函數(shù),大多數(shù)情況是友元函數(shù)是某個類的成員函數(shù),即即A類中的某個成員函數(shù)是類中的某個成員函數(shù)是B類中的友元函數(shù),這個成類中的友元函數(shù),這個成員函數(shù)可以直接訪問員函數(shù)可以直接訪問B類中的私有數(shù)據(jù)。類中的私有數(shù)據(jù)。這就實現(xiàn)這就實現(xiàn)了類與類之間的溝通了類與類之間的溝通。注意:一個類的成員函數(shù)作為另一個類的友元函數(shù)時,注意:一個類的成員函數(shù)作為另一個類的友元函數(shù)

23、時,應(yīng)應(yīng)先定義友元函數(shù)所在的類。先定義友元函數(shù)所在的類。class A.void fun( B &);class B.friend void fun( B &);既是類既是類A的成員函數(shù)的成員函數(shù)又是類又是類B的友元函數(shù)的友元函數(shù)26class B ;/先定義類先定義類A,則首先對類,則首先對類B作引用性說明作引用性說明class A ./類類A的成員定義的成員定義 public: void fun( B & );/函數(shù)的原型說明函數(shù)的原型說明 ;class B. friend void A:fun( B & );/定義友元函數(shù)定義友元函數(shù); void A:fun ( B &b) /函數(shù)的完整

24、定義函數(shù)的完整定義 ./函數(shù)體的定義函數(shù)體的定義類類A中的成員函數(shù)中的成員函數(shù)fun()是類是類B的友元函的友元函數(shù)。即在數(shù)。即在fun()中可中可以直接引用類以直接引用類B的私的私有成員。有成員。27class B;/必須在此進(jìn)行引用性說明,必須在此進(jìn)行引用性說明,class Afloat x,y;public: A(float a, float b) x=a; y=b; float Sum(B &); /說明友元函數(shù)的函數(shù)原型,是類說明友元函數(shù)的函數(shù)原型,是類A的一成員函數(shù)的一成員函數(shù);class Bfloat m,n;public: B(float a,float b) m=a;n=b;

25、 friend float A:Sum(B &);/說明類說明類A的成員函數(shù)是類的成員函數(shù)是類B的友元函數(shù)的友元函數(shù)float A:Sum( B &b)/定義該友元函數(shù)定義該友元函數(shù) x=b.m+b.n; y=b.m-b.n; void main(void) A a1(3,5); B b1(10,20); a1.Sum(b1); /調(diào)用該函數(shù),調(diào)用該函數(shù),因是類因是類A的成員函數(shù),故用類的成員函數(shù),故用類A的對象調(diào)用的對象調(diào)用a1.x=30a1.y=-10直接引用類直接引用類B的私有成員的私有成員類類A中有一個函數(shù)可以直中有一個函數(shù)可以直接引用類接引用類B的私有成員的私有成員28友元類友元類c

26、lass A . friend class B;class B . 類類B是類是類A的友元的友元類類B可以自由使用可以自由使用類類A中的成員中的成員對于類對于類B而言,類而言,類A是透明的是透明的類類B必須通過必須通過類類A的對象的對象使用類使用類A的成員的成員29const float PI =3.1415926;class Afloat r ;float h;public: A(float a,float b)r=a; h=b;float Getr()return r;float Geth()return h;friend class B;/定義類定義類B為類為類A的友元的友元;class

27、 B int number;public: B(int n=1)number=n;void Show(A &a) coutPI*a.r*a.r*a.h*numberendl; /求類求類A的某個對象的某個對象*n的體積的體積;void main(void)A a1(25,40),a2(10,40);B b1(2);b1.Show (a1); b1.Show (a2);直接引用類直接引用類A的私有成員的私有成員類類B中的任何函數(shù)都中的任何函數(shù)都能使用類能使用類A中的所有中的所有私有成員。私有成員。301. 寫出以下程序的運(yùn)行結(jié)果。寫出以下程序的運(yùn)行結(jié)果。#includeclass Aint i;public:static int count;A(int a=0)i=a+count;count+;coutc

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論