版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、 第15章 靜態(tài)成員與友元2本章主要內(nèi)容 15.1 靜態(tài)成員的需要性 15.2 靜態(tài)成員的使用 15.3 靜態(tài)數(shù)據(jù)成員 15.4 靜態(tài)成員函數(shù) 15.5 需要友員的原因 15.6 友員的使用 作業(yè)3如果類的某些屬性希望他的所有對(duì)象共享,怎么辦?數(shù)據(jù)共享途徑: 途徑一:全局變量或全局對(duì)象具有局限性破壞程序模塊結(jié)構(gòu)屬于程序,而不屬于類途徑二:靜態(tài)成員被該類的所有對(duì)象共享15.1 靜態(tài)成員的需要性415.1 靜態(tài)成員的需要性目的:類的所有對(duì)象共享某些資源 class Student / ; int count; /學(xué)生人數(shù) Student * pFirst; /學(xué)生類鏈表首指針 void fn( )
2、 Student ss; /創(chuàng)建第一個(gè)學(xué)生對(duì)象 count+; /學(xué)生人數(shù)增1 pFirst=&ss; /沒有對(duì)pFirst約束,隨便亂用,完全沒把它當(dāng)鏈?zhǔn)字羔?/fn( )退出時(shí),ss作用域中止并被析構(gòu) ,可學(xué)生人數(shù)忘了減1 515.2 靜態(tài)成員的使用靜態(tài)成員是類中的成員,是類的一部分,在類外不可任意訪問,從而起到保護(hù)作用。靜態(tài)成員有靜態(tài)數(shù)據(jù)成員和靜態(tài)成員函數(shù)之分。聲明格式:static 成員聲明;靜態(tài)數(shù)據(jù)成員與靜態(tài)變量相似,具有靜態(tài)生存期,是在類中聲明的全局?jǐn)?shù)據(jù)成員,能被同一個(gè)類的所有對(duì)象所共享。公有靜態(tài)成員函數(shù)不僅可以通過類對(duì)象來訪問,還可通過“類名:靜態(tài)成員函數(shù)”的形式在程序中直接調(diào)用
3、。615.2 靜態(tài)成員的使用/ ch15_1.cpp#include #include class Student protected: static int noOfStudents; char name40; public: Student(char* pName =no name) cout create one studentn; strncpy(name, pName,40); name39=0; noOfStudents +; /靜態(tài)成員:每創(chuàng)建一個(gè)對(duì)象,學(xué)生人數(shù)增1 cout noOfStudents endl; static int number( ) /靜態(tài)成員函數(shù) retu
4、rn noOfStudents; Student( ) cout destruct one studentn; noOfStudents-; /每析構(gòu)一個(gè)對(duì)象,學(xué)生人數(shù)減1 cout noOfStudents endl; ; int Student:noOfStudents =0; /靜態(tài)數(shù)據(jù)成員在類外分配空間和初始化 void fn( ) Student s1; Student s2; cout Student:number( ) endl; /調(diào)用靜態(tài)成員函數(shù)用類名引導(dǎo) int main( ) fn( ); cout Student:number( ) endl; /調(diào)用靜態(tài)成員函數(shù)用類名
5、引導(dǎo) 運(yùn)行結(jié)果: creat one student 1creat one student22 destruct one student1destruct one student00715.2 靜態(tài)成員的使用靜態(tài)數(shù)據(jù)成員不是某一個(gè)對(duì)象的一部分,而是所有對(duì)象共享它,并且能夠訪問它。靜態(tài)數(shù)據(jù)成員要在程序一開始運(yùn)行時(shí)就必須存在。因?yàn)楹瘮?shù)在程序運(yùn)行中被調(diào)用,所以靜態(tài)數(shù)據(jù)成員不能在任何函數(shù)內(nèi)分配空間和初始化。 這樣,靜態(tài)數(shù)據(jù)成員的空間分配有三個(gè)可能的地方:(1)作為類的外部接口的頭文件,那里有類聲明;(2)類定義的內(nèi)部實(shí)現(xiàn),那里有類的成員函數(shù)定義;(3)應(yīng)用程序的main( )函數(shù)前的全局?jǐn)?shù)據(jù)聲明和定義
6、處。 815.2 靜態(tài)成員的使用例如,下面的代碼重用Student類,但在應(yīng)用程序中不得不再定義Student類的靜態(tài)數(shù)據(jù)成員:/student.h 類定義class Student protected: static int noOfStudents; /靜態(tài)數(shù)據(jù)成員聲明 char name40; public: Student(char* pName =no name); Student( ); static int number( ); /靜態(tài)成員函數(shù)聲明 ;915.2 靜態(tài)成員的使用/student.cpp類的內(nèi)部實(shí)現(xiàn)#include #include #include student
7、.hStudent:Student(char* pName) cout create one studentn; strncpy(name, pName, 40); name39 = 0; noOfStudents+; cout noOfStudents endl; Student:Student( ) cout destruct one studentn; noOfStudents-; cout noOfStudents endl; int Student:number( ) /靜態(tài)成員函數(shù) return noOfStudents; 1015.2 靜態(tài)成員的使用file2.cpp /應(yīng)用程序
8、重用了Student類#include “student.h”#include int Student:noOfStudents=0; /初始化靜態(tài)成員,不便于重用void fn( ) Student s1; Student s2; coutStudent:number( )endl;int main( ) fn( ); coutStudent:number( )endl; return 0; 1115.2 靜態(tài)成員的使用靜態(tài)數(shù)據(jù)成員是類的一部分,靜態(tài)數(shù)據(jù)成員的定義是類定義的一部分,故可將其放在類的內(nèi)部實(shí)現(xiàn)部分中定義。定義時(shí),要用類名引導(dǎo)。重用該類時(shí),簡(jiǎn)單地包含其頭文件即可。 例如,下面的程序
9、將ch15_1.cpp改成了多文件程序?qū)崿F(xiàn)結(jié)構(gòu): / student.h class Student protected: static int noOfStudents; /靜態(tài)數(shù)據(jù)成員聲明 char name40; public: Student(char* pName =no name); Student( ); static int number( ); /靜態(tài)成員函數(shù)聲明 ;1215.2 靜態(tài)成員的使用/student.cpp類的內(nèi)部實(shí)現(xiàn)#include #include #include “student.h”int Student:noOfStudents = 0;Student
10、:Student(char* pName) cout create one studentn; strncpy(name, pName, 40); name39 = 0; noOfStudents+; cout noOfStudents endl; Student:Student( ) cout destruct one studentn; noOfStudents-; cout noOfStudents endl; int Student:number( ) return noOfStudents; 1315.2 靜態(tài)成員的使用/ch15_2.cpp #include student.h /
11、重用Student類 #include void fn( ) Student s1; Student s2; cout Student:number() endl; int main() fn( ); cout Student:number() endl; return 0; 工程文件ch15_2.prg包含: student.cppch15_2.cpp1415.3 靜態(tài)數(shù)據(jù)成員使用靜態(tài)數(shù)據(jù)成員可以節(jié)省內(nèi)存,因?yàn)樗淮鎯?chǔ)一處,供所有對(duì)象共享。靜態(tài)數(shù)據(jù)成員的值是可修改的,但它對(duì)每個(gè)對(duì)象都是一樣的。1. 定義和使用與靜態(tài)變量相似,靜態(tài)數(shù)據(jù)成員是靜態(tài)存儲(chǔ)(static)的,它必須按下列兩個(gè)步驟進(jìn)行:
12、在類中使用關(guān)鍵字static聲明靜態(tài)數(shù)據(jù)成員。 在類外為靜態(tài)數(shù)據(jù)成員分配內(nèi)存空間并初始化。 其定義格式如下::=15【例】靜態(tài)數(shù)據(jù)成員的使用示例#include using namespace std;class CSum public:CSum(int a = 0, int b = 0) /A nSum += a+b; int getSum() return nSum; void setSum(int sum) nSum = sum; private:static int nSum;int CSum:nSum = 0;int main()CSum one(10, 2), two;couton
13、e:sumone.getSum()endl;couttwo:sum=two.getSum()endl;two.setSum(5);coutone:sum=one.getSum()endl;couttwo:sum=two.getSum()endl;return 0;運(yùn)行結(jié)果:one:sum=12two:sum=12one:sum= 5two:sum=51615.3 靜態(tài)數(shù)據(jù)成員2. 幾點(diǎn)說明(1)靜態(tài)數(shù)據(jù)成員是類中的成員,它的訪問屬性同普通數(shù)據(jù)成員一樣,可以為public、private和protected。(2)靜態(tài)數(shù)據(jù)成員的實(shí)際定義和初始化本身是不受public、private和protec
14、ted等訪問屬性限制的。(3)靜態(tài)數(shù)據(jù)成員可看成是類中聲明、類外定義的靜態(tài)全局變量,具有靜態(tài)生存期,在程序中從實(shí)際定義時(shí)開始產(chǎn)生,到程序結(jié)束時(shí)消失。 (4)當(dāng)靜態(tài)數(shù)據(jù)成員為public時(shí),在類外對(duì)該成員的訪問和引用可通過對(duì)象,也可直接引用。:1715.3 靜態(tài)數(shù)據(jù)成員例:class CSum /public:static int nSum;int CSum:nSum=0;int main()CSum one;one.nSum=10;CSum:nSum=12; /常用方式coutone.nSumendl;return 0;1815.3 靜態(tài)數(shù)據(jù)成員例: class Student public:
15、 Student( ) noOfStudent+; / static int noOfStudent; /公共靜態(tài)數(shù)據(jù)成員 / ; void fn(Student& s1,Student& s2) couts1.noOfStudents; cout Student:noOfStudents; /此處也可以訪問靜態(tài)數(shù)據(jù)成員 193. 靜態(tài)數(shù)據(jù)成員的使用場(chǎng)合:(1) 用來保存流動(dòng)變化的對(duì)象個(gè)數(shù);(2) 存儲(chǔ)鏈表的第一個(gè)或者最后一個(gè)成員的內(nèi)存地址 一個(gè)指針;(3) 作為一個(gè)標(biāo)記,標(biāo)記一些動(dòng)作是否發(fā)生;15.3 靜態(tài)數(shù)據(jù)成員2015.3 靜態(tài)數(shù)據(jù)成員(選講)例ch15_4,創(chuàng)建一個(gè)學(xué)生單向鏈表。cla
16、ss Studentpublic: Student(char* pName); Student();protected: static Student* pFirst; Student* pNext; char name40;Student* Student:pFirst =0;Student:Student(char* pName) strncpy(name,pName,sizeof(name); namesizeof(name)-1 =0; pNext =pFirst; /每新建一個(gè)結(jié)點(diǎn)(對(duì)象),就將其掛在鏈?zhǔn)?pFirst =this;2115.3 靜態(tài)數(shù)據(jù)成員Student:Stude
17、nt() cout name pNext) if(pS-pNext=this) /找到時(shí),pS指向當(dāng)前結(jié)點(diǎn)的結(jié)點(diǎn) pS-pNext=pNext; /pNext即this-pNext return; Student* fn() Student* pS =new Student(Jenny); Student sb(Jone); return pS;2215.3 靜態(tài)數(shù)據(jù)成員void main() Student sa(Jamsa); Student* sb =fn(); Student sc(Tracey); delete sb;運(yùn)行結(jié)果:JoneJennyTraceyJamsa2315.4 靜
18、態(tài)成員函數(shù)靜態(tài)成員函數(shù):在類的定義體中,前面被冠以“static”的成員函數(shù)。靜態(tài)成員函數(shù)和靜態(tài)數(shù)據(jù)成員一樣,都屬于類的靜態(tài)成員,但它們都不專屬于某個(gè)對(duì)象,而是所有對(duì)象所共享的成員。因此,訪問靜態(tài)成員函數(shù)時(shí),也不需要對(duì)象。:在類中,靜態(tài)數(shù)據(jù)成員可以被成員函數(shù)或靜態(tài)成員函數(shù)所引用。但反過來,靜態(tài)成員函數(shù)卻不能直接引用類中說明的非靜態(tài)成員。 Page 232415.4 靜態(tài)成員函數(shù)Page 24例如,下面的程序,兩種調(diào)用靜態(tài)成員函數(shù)的方法都是合法的,且意義一樣: #include class Student public: static int number( ) return noOfStude
19、nts; /. protected: char name40; static int noOfStudents; ; int Student:noOfStudents = 1; int main( ) Student s; cout s.number() endl; /ok 用對(duì)象引用靜態(tài)成員函數(shù) cout Student:number() endl; /ok 用類名引導(dǎo)靜態(tài)成員函數(shù) 2515.4 靜態(tài)成員函數(shù)一個(gè)靜態(tài)成員函數(shù)不與任何對(duì)象相聯(lián)系,故不能對(duì)非靜態(tài)成員進(jìn)行默認(rèn)訪問。例: #include class Student public: static char* sName()/靜態(tài)成員
20、函數(shù)為所有對(duì)象共享 coutnoOfStudentsendl; return name; /error哪個(gè)對(duì)象? protected: char name40; static int noOfStudents; ;26 int Student:noOfStudents=0; void fn( ) / Student s; couts.sName( )endl; /sName( )從對(duì)象s上得到的是Student類型 /故可寫成:Student : sName( ) 15.4 靜態(tài)成員函數(shù)2715.4 靜態(tài)成員函數(shù)(選講)靜態(tài)成員函數(shù)借助靜態(tài)數(shù)據(jù)成員頭指針可以對(duì)非靜態(tài)成員訪問。例ch15-6.c
21、pp說明了一個(gè)訪問對(duì)象中成員的方法: #include #include class Student public: Student(char* pName); Student( ); static Student* findname(char* pName); protected: static Student* pFirst; Student* pNext; char name40; ;Page 2728 Student* Student:pFirst = 0; /靜態(tài)成員空間分配及初始化 Student:Student(char*pName)/頭插法 strncpy(name,pName
22、, sizeof(name); namesizeof(name)-1=0; pNext=pFirst; pFirst=this; Student:Student( ) if(pFirst=this)pFirst=pNext; return; for(Student* pS=pFirst; pS; pS=pS-pNext) if(pS-pNext=this) pS-pNext=pNext; return; /查找被析構(gòu)的節(jié)點(diǎn) Page 2815.4 靜態(tài)成員函數(shù)2915.4 靜態(tài)成員函數(shù)Student* Student:findname(char* pName)/靜態(tài)成員函數(shù) for(Stude
23、nt* pS=pFirst; pS; pS=pS-pNext) if(strcmp(pS-name,pName)=0) return pS; return (Student*)0;int main( ) Student s1(Randy); Student s2(Jenny); Student s3(Kinsey); Student* pS =Student:findname(Jenny) if(pS) cout ok. endl; else cout no find. endl; return 0;3015.5 需要友元的原因問題的提出:對(duì)象的保護(hù)和私有成員:只允許本類的成員函數(shù)訪問 為了提
24、高效率,希望本類以外的對(duì)象或函數(shù)能夠訪問類中的保護(hù)和私有成員 友元:提供了本類外的對(duì)象訪問保護(hù)和私有成員的途徑。Page 3031友元:一個(gè)類的友元可以訪問這個(gè)類的保護(hù)和私有成員(公有成員當(dāng)然能夠訪問,但是一般不要改變其值。)友元可以是下列之一: (1)友元函數(shù)不屬于任何類的一般函數(shù) (2)友元成員函數(shù)另一個(gè)類的某個(gè)成員函數(shù) (3)友元類另一個(gè)類(整個(gè)類作友元)注意:友元使得類的封裝性受到影響,程序的可維護(hù)性變差,應(yīng)慎重使用 Page 3115.5 需要友元的原因3215.6 友元的使用友元的聲明和定義友元聲明:友元聲明的位置可在類的任何部位,既可在public區(qū),也可在protected區(qū),
25、意義完全一 樣。友元的定義:友元不屬于本類的成員,所以友元的定義不能在本類的定義體中。 1. 友元函數(shù)友元函數(shù):不屬于任何類的、被聲明為某個(gè)類的友元的一般函數(shù)。友元函數(shù)定義在類的外部,一般與類的成員函數(shù)定義放在一起。格式:friend (形參表) #includeclass A protected: int x,y; public: int z; A(int xx=0,int yy=0,int zz=0):x(xx),y(yy),z(zz) friend void in(A); friend void sh(A); ;void in(A a1) couta1.xa1.ya1.z; couta1
26、.x a1.y a1.zendl; void sh(A a2) couta2.x a2.y a2.zendl; int main() A a1(11,22,33); sh(a1); in(a1); sh(a1); return 0;3415.6友元的使用2.友元成員函數(shù)友元成員函數(shù):其他某個(gè)類的成員函數(shù),是本類的友元格式: friend 函數(shù)返回類型 類名標(biāo)識(shí)符:函數(shù)名(參數(shù)列表);說明:友元成員函數(shù)的聲明,除了前面冠以“friend”外,還要注明所屬類的類名。友元成員函數(shù)應(yīng)該在自己所屬類的定義體中進(jìn)行定義。3515.6友元的使用class Student; /前項(xiàng)聲明,類名聲明class T
27、eacher / public: void assignGrades(Student& s); /給定成績(jī) protected: int noOfStudents; Student * pList100; ; class Student public: / friend void Teacher:assignGrades (Student&s); /是學(xué)生類的友元成員函數(shù),同時(shí)又是教師類的成員函數(shù) Page 353615.6友元的使用 protected: Teacher * pT; int semesterHours; float gpa; ; void Teacher:assignGrades(Student& s) s.
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 精準(zhǔn)醫(yī)療中心人員聘用合同模板
- 婚紗攝影店電梯銷售合同
- 冷藏租賃協(xié)議:化妝品冷藏專用
- 商業(yè)步行街?jǐn)偽蛔赓U協(xié)議
- 低碳環(huán)保項(xiàng)目施工合同
- 財(cái)務(wù)渠道拓展財(cái)務(wù)總監(jiān)招聘協(xié)議
- 博物館工程商品混凝土施工合同
- 玩具企業(yè)會(huì)計(jì)聘用合同
- 地下通道腳手架施工協(xié)議范本
- 服裝出口業(yè)務(wù)員招聘合同模板
- 山東省政府采購(gòu)專家復(fù)審考試題庫
- 《“歪腦袋”木頭樁》閱讀測(cè)試
- GB/T 3246.2-2000變形鋁及鋁合金制品低倍組織檢驗(yàn)方法
- 主要農(nóng)作物(糧食作物)課件
- 百詞斬-定語從句課件-(;)
- 新舊公司法對(duì)照表
- 三年級(jí)上冊(cè)英語課件-Unit3 Look at me-人教(PEP) (6)(共30張PPT)
- 西方音樂史課程大綱
- 2022-《參與感:小米口碑營(yíng)銷內(nèi)部手冊(cè)》
- 三級(jí)醫(yī)院醫(yī)療設(shè)備配置標(biāo)準(zhǔn)
- 合法離婚協(xié)議書(2篇)
評(píng)論
0/150
提交評(píng)論