




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第六講類類的引入類的具體語法形式構(gòu)造函數(shù)和析構(gòu)函數(shù)this指針、靜態(tài)成員和常量成員友元和嵌套類對象數(shù)組和指針間的關(guān)系C是C++的子集,C++具備了封裝、繼承和多態(tài)性等主要面向?qū)ο筇卣?。?dāng)退化為C時,處理要求高效率的地方和C完全相同;強調(diào)面向?qū)ο筇匦詴r,一般比C慢百分之十幾。C++更好的C:C++簡潔的單行注釋;嚴(yán)格的參數(shù)檢查;用引用傳遞參數(shù);靈活的局部變量說明(C是在任何執(zhí)行語句前);內(nèi)聯(lián)函數(shù)(凡是有循環(huán)語句或switch語句的函數(shù)不能成為內(nèi)聯(lián)函數(shù));常量修飾,包括幾種常量指針;空間申請和釋放;數(shù)據(jù)的抽象和封裝:傳統(tǒng)的程序設(shè)計語言強調(diào)“功能”(函數(shù)、操作),數(shù)據(jù)的功能不如功能大,只提供幾種內(nèi)部數(shù)據(jù)類型;C++提升了數(shù)據(jù)的重要性,建立新的數(shù)據(jù)類型和表示出這些數(shù)據(jù)類型的對象之間的交互性是重要的。6.1類的引入類是結(jié)構(gòu)的擴(kuò)展,可用來對外部函數(shù)訪問的限制。stack.hvoidpush(char);charpop();stack.cpp#include”stack.h”staticcharv[100];staticchar*p=v;voidpush(charc){//……}charpop(){//……}局部變量隱藏在函數(shù)體內(nèi);通過函數(shù)的參數(shù)傳遞共享變量。使用靜態(tài)全局變量,局限于文件。數(shù)據(jù)量大時,效率低使用全局變量,程序中每個函數(shù)都可以訪問。查錯困難other.cppinclude<iostream.h>include“stack.h”voidsome_function(){push(‘c’);charc=pop();}poppushvp函數(shù)函數(shù)公共接口私有數(shù)據(jù)外部函數(shù)通過公共接口訪問數(shù)據(jù),而不必關(guān)心數(shù)據(jù)的存儲形式。但存放的是具體的數(shù)據(jù),而不是數(shù)據(jù)的描述。使用多個堆棧要重新定義結(jié)構(gòu)是對數(shù)據(jù)描述,可創(chuàng)建多個對象。堆棧的結(jié)構(gòu)版本:structstack{charv[100];char*p;voidpush(charc){//……}charpop(){//……}};
C++引入類解決上述問題(限制全局變量使用和構(gòu)成新類型)堆棧的使用:stacksta1,sta2;sta1.p=sta1.v;sta2.p=sta2.v;sta1.push(‘c’);外部函數(shù)可直接訪問結(jié)構(gòu)的成員。破壞了數(shù)據(jù)的封裝特性6.2類定義與結(jié)構(gòu)不同之處是成員訪問說明符。除該類的成員函數(shù)外,誰都不得訪問程序中所有函數(shù)都可訪問可以省去類的實例也就是所謂的對象:
stacksta1;stack*pstack=newstack;堆棧的類版本:classstack{private:charv[100];char*p;public:voidpush(charc){//……}charpop(){//……}};可用一特殊成員函數(shù)(構(gòu)造函數(shù))初始化,每當(dāng)創(chuàng)建對象時系統(tǒng)自動調(diào)用此函數(shù)。名字與類相同,無返回值,公有成員函數(shù)類的定義,初始化無效類的使用:voidmain(){stacksta;sta.p=sta.v;sta.push(‘a(chǎn)’);charch=sta.pop();}6.3構(gòu)造函數(shù)和析構(gòu)函數(shù)classc{intn=0;intrint=n;//….}一個類的普通成員數(shù)據(jù),在不同的對象中占用不同的空間;但成員函數(shù)不管在哪個實例中調(diào)用,都占用同一空間。classstack{private:charv[100];char*p;public:stack(){p=v;}voidpush(charc);voidpop();};類外定義函數(shù),要用::無參,缺省構(gòu)造函數(shù)類的使用:voidmain(){//……stacksta;sta.push(‘a(chǎn)’);charch=sta.pop();}1、為sta分配空間2、調(diào)用構(gòu)造函數(shù)構(gòu)造函數(shù)可帶參數(shù):classstack{private:char*v;char*p;intsize;public:stack(){p=v;}stack(intsz){v=newchar[size=sz];p=v;}//……};還可以給一缺省值構(gòu)造函數(shù)可以重載。例如:即可以有缺省構(gòu)造函數(shù),同時又有一個帶參構(gòu)造函數(shù),這時要注意二義性。v數(shù)組是動態(tài)分配的,出作用域并不自動釋放。
析構(gòu)函數(shù)類名前加~,無返回值,無參數(shù)(不能重載)例如:
~stack(){delete[]v;}構(gòu)造函數(shù)和析構(gòu)函數(shù)的調(diào)用時間:對象類型構(gòu)造函數(shù)調(diào)用析構(gòu)函數(shù)調(diào)用全局對象程序運行程序結(jié)束局部對象對象定義處離開程序塊靜態(tài)局部對象對象定義處程序結(jié)束New動態(tài)創(chuàng)建的對象創(chuàng)建對象處Delete顯式撤消6.4類成員6.4.1this指針在創(chuàng)建類對象后,用.和訪問數(shù)據(jù)成員和成員函數(shù)。例如:
CTesttest1;CTest*ptest2=newCTest;//……cout<<test1.n<<endl;cout<<ptest2->n<<endl;實際上編譯器給成員函數(shù)傳遞一個隱藏的對象指針,指向函數(shù)調(diào)用所要引用的對象。函數(shù)隱式地使用這個指針。例如:CTesttest;test.getn();編譯器傳給getn()一個隱藏的指向test對象指針,getn()使用這個指針訪問test的成員n。C++用關(guān)鍵字this可訪問這個指針。
this的定義形式為:
T*constthis;因此,getn()中的returnn;returnthis->n;而在成員函數(shù)內(nèi):
classCTest{public:intn;intgetn(){returnn;}};編譯器引用的是哪個實例對象的n?6.4.2成員對象和成員對象指針一個數(shù)據(jù)成員定義為另一個類的對象——成員對象創(chuàng)建類對象時,也要創(chuàng)建成員對象;用構(gòu)造函數(shù)初始化嵌套對象時,也要用成員對象的構(gòu)造函數(shù)初始化成員對象。用初始化符表傳遞成員對象構(gòu)造函數(shù)所需的參數(shù)。classCEmbedded{public:CEmbedded(intParam1,intParam2){//……}};classCContainer{private:CEmbeddedembed;public:CContainer(intp1,intp2,intp3):embed(p1,p2){//……}};
冒號,一個或多個用逗號分開的成員初始化符
初始化符表
成員初始化符數(shù)據(jù)成員名和括起來的初始值用成員初始化符表初始化其它數(shù)據(jù)類型——常量和引用不能在構(gòu)造函數(shù)中用賦值初始化。classC{private:intn;
constintcInt;int&rInt;public:C(intparam):n(param),cInt(5),rInt(n){//……}};語句:Ccobject(0);使cobject的n和cInt被初始化為0和5,數(shù)據(jù)成員rInt初始化為n的別名。一個數(shù)據(jù)成員定義為另一個類的對象的指針——成員對象指針:classtable{public:table(){//…}table(intsize){//……}};classclassdef{table*members;table*friends;intno_of_members;public:classdef(intsize);~classdef();};classdef::classdef(intsize){members=newtable(size);friends=newtable;no_of_members=size;}classdef::~classdef(){deletemembers;deletefriends;}new不僅有類型,還要跟上初始化類型對象的參數(shù).初始化,用函數(shù)調(diào)用形式.生成類對象時并不一定要生成所指對象,不必用成員初始化符表,而是在生成它所指對象時再初始化。6.4.3靜態(tài)類成員classCTest{public:staticintcount;//……};intCTest::count=0;//……由于這種靜態(tài)類成員獨立于任何類對象存在,用::定義,而無需引用類實例。Static成員和整個程序作業(yè)一樣持久,但作用域僅限于此類。另外,其它訪問也是受控的(公有、私有、保護(hù)的)。
類中聲明
類外定義和初始化靜態(tài)成員函數(shù):classCTest{public:staticintgetCount(){//……}//……};
voidmain(){intcount=CTest::getCount();//……}無論CTest創(chuàng)建多少個實例,count將嚴(yán)格只存放一個拷貝。靜態(tài)成員函數(shù)只可以引用屬于該類的靜態(tài)數(shù)據(jù)成員或靜態(tài)成員函數(shù)。#include<iostream.h>classCTest{private:staticintcount;public:
CTest(){++count;}~CTeat(){--count;}staticintgetCount(){returncount;}};intCTest::count=0;類外代碼用類名和作用域分辨符調(diào)用,無需引用具體實例,甚至類實例可以不存在。因為無this指針,企圖訪問非靜態(tài)成員,編譯器無法判定它所要訪問的數(shù)據(jù)成員是屬于哪個類的。voidmain(){cout<<CTest::getCount()<<“objectexist\n”;CTesttest1;CTest*ptest2=newCTest;cout<<CTest::getCount()<<“objectexist\n”;deleteptest2;cout<<CTest::getCount()<<“objectexist\n”;}函數(shù)作為友員:classt1{private:intdata;friendvoidfriend_t1(tifri);public:
t1(){data=12;}voiduse_friend();};
voidfriend_t1(tifri)//外部函數(shù){fri.data=10;}6.5友員、嵌套類和結(jié)構(gòu)6.5.1友員友員給予別的類或非成員函數(shù)訪問私有成員權(quán)利。在此類中用關(guān)鍵字friend聲明,公有或私有區(qū)聲明都行。voidt1::use_friend(){t1fri;this->friend_t1(fri);::friend_t1(fri);}voidmain(){t1fri,fri1;fri.friend_t1(fri);friend_t1(fri);}友員不是成員——不能用this指針訪問它。另一類的成員作為友元:classx{public:voidf();private:inti;};classy{friendvoidx::f();inti;public://……};voidx::f(){yyi;yi.i=10;}
poppushvp函數(shù)函數(shù)公共接口私有數(shù)據(jù)友元整個類作為另一個類的友元:classx{friendclassy;//……};6.6對象、指針和數(shù)組6.6.1對象數(shù)組對象數(shù)組存放一組對象。在創(chuàng)建時,數(shù)組的每一個對象都調(diào)用缺省構(gòu)造函數(shù)進(jìn)行初始化。若此類只有帶參構(gòu)造函數(shù),使用初始化符表。classant{public:ant(char*name){//……}};intmain(){antcolony_number[4]={ant(“ant1”),ant(“ant2”),
ant(“ant3”),ant(“ant4”)};//……}6.6.2指向數(shù)據(jù)成員的指針?biāo)赋蓡T所屬的類所指成員的類型classA{inta;public:
intb;intc;};intA::*p_A=&A::a;intA::*p_A_int=&A::b;Aa1;a1.*p_A_int=2;p_A_int=&A::c;a1.*p_A_int=3;A*pA=&a1;pA->*p_A_int=4;指向數(shù)據(jù)成員的指針一般形式:
類型類名::*指針名;一般說來,成員數(shù)據(jù)都是私有的,這里只是為了說明方便。指向成員函數(shù)的指針一般形式:返回類型(類名::*指針名)(參數(shù)類型)classX{public:
intmf1(char*);intmf2(int);};
classY{public:intmf3(char*);};int(X::*pmf_int_cp)(char*);pmf_int_cp=&X::mf1;Xx1;intp1=(x1.*pmf_int_cp)(“string”);pmf_int_cp=&X::mf2;pmf_int_cp=&Y::mf3;6.7一個完整的類屏幕上畫矩形:LeftRightTopBottom矩形類Crectangle:用對角坐標(biāo)定義矩形;構(gòu)造函數(shù);析構(gòu)函數(shù);屏幕上畫矩形函數(shù);classCRectangle{private:intLeft;intTop;intRight;intBottom;public:CRectangle();CRectangle(intL,intT,intR,intB);voiddraw(void);voidgetcoord(int*L,int*T,int*R,int*B);voidsetcoord(intL,intT,intR,intB);};調(diào)用setcoord設(shè)定坐標(biāo)調(diào)用Line畫圖將坐標(biāo)值傳給參數(shù)//CRECT.hclassCRectangle{private:intLeft;intTop;intRight;intBottom;public:CRectangle(){Left=Top=Right=Bottom=0;}CRectangle(intL,intT,intR,intB){setcoord(L,T,R,B);}voiddraw(void);voidgetcoord(int*L,int*T,int*R,int*B){*L=Left;*T=Top;*R=Right;*B=Bottom;}voidsetcoord(intL,intT,intR,intB);};inlineintmax(intp1,intp2){returnp1>p2?p1:p2;}inlineintmin(intp1,intp2){returnp1<p2?p1:p2;}
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 個人財產(chǎn)安全設(shè)備銷售與租賃合同
- 外墻保溫裝飾一體板施工合同
- 學(xué)校專家聘用合同
- 關(guān)于提高工作效率的溝通機制研究報告
- 鄉(xiāng)村發(fā)展行動指導(dǎo)書
- 制造業(yè)企業(yè)數(shù)字化轉(zhuǎn)型實施方案
- 核電安全施工方案模板
- 籃球場工程施工方案
- 河南電力電纜線槽施工方案
- 建筑工程切險保險合同
- 【公開課課件】6.4.3余弦定理、正弦定理1課件-2021-2022學(xué)年高一下學(xué)期數(shù)學(xué)人教A版(2019)必修第二冊
- 防水板臺車施工方案
- 提高地下室管線一次性安裝合格率
- 小學(xué)三年級數(shù)獨比賽“六宮”練習(xí)題
- 實驗一、儀器的認(rèn)領(lǐng)、洗滌、干燥及樣品的稱量
- 通橋(2013)8388A常用跨度梁橋面附屬設(shè)施_圖文
- SF_T 0112-2021 法醫(yī)臨床影像學(xué)檢驗實施規(guī)范_(高清版)
- 干部調(diào)動介紹信(存根)Word版
- 油田科研單位有效發(fā)揮技術(shù)專家作用初探
- 席位卡A4紙打印模板(共3頁)
- 研究生英語寫譯教程基礎(chǔ)級第三版袁錫興楊若東寫作篇Chapter1Theparagraph
評論
0/150
提交評論