




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
靜態(tài)成員與友元演示文稿目前一頁(yè)\總數(shù)三十六頁(yè)\編于七點(diǎn)優(yōu)選靜態(tài)成員與友元目前二頁(yè)\總數(shù)三十六頁(yè)\編于七點(diǎn)靜態(tài)成員與友元
學(xué)習(xí)本章后,應(yīng)該掌握聲明靜態(tài)數(shù)據(jù)成員,掌握使用靜態(tài)成員函數(shù)以及靜態(tài)成員函數(shù)與特定對(duì)象無(wú)關(guān)的特性。把握友元的使用,理解友元作用的局限性。目前三頁(yè)\總數(shù)三十六頁(yè)\編于七點(diǎn)第六章靜態(tài)成員與友元函數(shù)
§6-1靜態(tài)成員
§6-2友元
§6-3const數(shù)據(jù)保護(hù)目前四頁(yè)\總數(shù)三十六頁(yè)\編于七點(diǎn)§6-1靜態(tài)成員
6.1.1靜態(tài)成員的需要性有一些屬性是類(lèi)中所有成員所共有的,屬于類(lèi)的一部分,但既不適于用普通成員表示,也不適于全局變量表示的數(shù)據(jù),用靜態(tài)成員表示。對(duì)象個(gè)數(shù)對(duì)象鏈表頭、尾指針類(lèi)的狀態(tài)一個(gè)類(lèi)對(duì)象的public成員可被本類(lèi)的其他對(duì)象存取,即可供所有對(duì)象使用,但是此類(lèi)的每個(gè)對(duì)象都各自擁有一份,不存在真正意義上的共享成員。所以,C++提供了靜態(tài)成員,用以解決同一個(gè)類(lèi)的不同對(duì)象之間數(shù)據(jù)成員和函數(shù)的共享問(wèn)題。目前五頁(yè)\總數(shù)三十六頁(yè)\編于七點(diǎn)§6-1靜態(tài)成員
聲明為static的類(lèi)成員為靜態(tài)成員,解決同一個(gè)類(lèi)的不同對(duì)象之間的數(shù)據(jù)和函數(shù)共享問(wèn)題。靜態(tài)成員的特點(diǎn)是:不管這個(gè)類(lèi)創(chuàng)建了多少個(gè)對(duì)象,其靜態(tài)成員在內(nèi)存中只保留一份拷貝,這個(gè)拷貝為該類(lèi)的所有對(duì)象所共享。類(lèi)的靜態(tài)成員有兩種:靜態(tài)數(shù)據(jù)成員和靜態(tài)函數(shù)成員,下面分別對(duì)它們進(jìn)行討論。目前六頁(yè)\總數(shù)三十六頁(yè)\編于七點(diǎn)6.1.2靜態(tài)數(shù)據(jù)成員
面向?qū)ο蠓椒ㄖ羞€有類(lèi)屬性(classattribute)的概念,類(lèi)屬性是描述類(lèi)的所有對(duì)象的共同特征的一個(gè)數(shù)據(jù)項(xiàng),對(duì)于任何對(duì)象實(shí)例,它的屬性值是相同的,C++通過(guò)靜態(tài)數(shù)據(jù)成員來(lái)實(shí)現(xiàn)類(lèi)屬性。靜態(tài)數(shù)據(jù)成員:是類(lèi)的數(shù)據(jù)成員的一種特例,采用static關(guān)鍵字來(lái)定義,屬于類(lèi)屬性,每個(gè)類(lèi)只有一個(gè)拷貝,由該類(lèi)的所有對(duì)象共同維護(hù)和使用,從而實(shí)現(xiàn)了同類(lèi)的不同對(duì)象之間的數(shù)據(jù)共享。
目前七頁(yè)\總數(shù)三十六頁(yè)\編于七點(diǎn)6.1.2靜態(tài)數(shù)據(jù)成員
靜態(tài)數(shù)據(jù)成員的定義分為兩個(gè)必不可少的部分:類(lèi)內(nèi)聲明、類(lèi)外初始化。在類(lèi)內(nèi),聲明靜態(tài)數(shù)據(jù)成員的格式為:
數(shù)據(jù)類(lèi)型類(lèi)名::靜態(tài)數(shù)據(jù)成員名=初始值;
static
數(shù)據(jù)類(lèi)型靜態(tài)數(shù)據(jù)成員名;
在類(lèi)外初始化的形式為:
除了在初始化時(shí)可以在類(lèi)外通過(guò)類(lèi)對(duì)靜態(tài)成員賦初值外,其他情況下對(duì)靜態(tài)成員的存取規(guī)則與一般成員相同。即:在類(lèi)內(nèi)可以任意存?。辉陬?lèi)外,通過(guò)對(duì)象只能訪問(wèn)存取屬性為public的成員。
目前八頁(yè)\總數(shù)三十六頁(yè)\編于七點(diǎn)6.1.2靜態(tài)數(shù)據(jù)成員對(duì)靜態(tài)數(shù)據(jù)成員的定義與使用應(yīng)注意
:靜態(tài)數(shù)據(jù)成員的訪問(wèn)屬性同普通數(shù)據(jù)成員一樣,可以為public、private和protected。靜態(tài)數(shù)據(jù)成員脫離具體對(duì)象而獨(dú)立存在,其存儲(chǔ)空間是獨(dú)立分配的,不是任何對(duì)象存儲(chǔ)空間的一部分,但邏輯上所有的對(duì)象都共享這一存儲(chǔ)單元,所以對(duì)靜態(tài)數(shù)據(jù)成員的任何操作都將影響共享這一存儲(chǔ)單元的所有對(duì)象。靜態(tài)數(shù)據(jù)成員是一種特殊的數(shù)據(jù)成員,它表示類(lèi)屬性,而不是某個(gè)對(duì)象單獨(dú)的屬性,它在程序開(kāi)始產(chǎn)生,在程序結(jié)束時(shí)消失。靜態(tài)數(shù)據(jù)成員具有靜態(tài)生存期。由于在類(lèi)的定義中僅僅是對(duì)靜態(tài)數(shù)據(jù)成員進(jìn)行了引用性聲明,因此必須在文件作用域的某個(gè)地方對(duì)靜態(tài)數(shù)據(jù)成員進(jìn)行定義并初始化,即應(yīng)在類(lèi)體外對(duì)靜態(tài)數(shù)據(jù)成員進(jìn)行初始化(靜態(tài)數(shù)據(jù)成員的初始化與它的訪問(wèn)控制權(quán)限無(wú)關(guān))。靜態(tài)數(shù)據(jù)成員初始化時(shí)前面不加static關(guān)鍵字,以免與一般靜態(tài)變量或?qū)ο蠡煜?。由于靜態(tài)數(shù)據(jù)成員是類(lèi)的成員,因此在初始化時(shí)必須使用類(lèi)作用域運(yùn)算符::限定它所屬的類(lèi)。目前九頁(yè)\總數(shù)三十六頁(yè)\編于七點(diǎn)12345678classStudent{private:char*Name;intNo;
staticintcountS;};//在類(lèi)外對(duì)靜態(tài)成員初始化如下:intStudent::countS=0;例如:我們對(duì)某學(xué)校不同學(xué)生的特性進(jìn)行抽象,找出共性設(shè)計(jì)一個(gè)學(xué)生類(lèi)Student,如果需要統(tǒng)計(jì)學(xué)生的總?cè)藬?shù),可以在類(lèi)外定義一個(gè)全局變量。但是類(lèi)外的全局變量不受類(lèi)存取控制的保護(hù)。因此可以將學(xué)生人數(shù)定義為靜態(tài)成員,即學(xué)生類(lèi)的類(lèi)屬性,設(shè)計(jì)的Student類(lèi)如下:注意:
對(duì)靜態(tài)數(shù)據(jù)成員的訪問(wèn)還可以通過(guò)類(lèi)的成員函數(shù)來(lái)進(jìn)行。
6.1.2靜態(tài)數(shù)據(jù)成員P335例子目前十頁(yè)\總數(shù)三十六頁(yè)\編于七點(diǎn)#include<iostream.h>classMyclass{public:Myclass(int,int,int);voidGetNumber();voidGetSum();private:intA,B,C;staticintSum;};intMyclass::Sum=0;Myclass(inta,intb,intc){A=a;B=b;C=c;Sum+=A+B+C;}voidGetNumber(){cout<<“Number=”<<A<<“,”<<B<<“,”<<C<<endl;}§6-1靜態(tài)成員voidGetSum(){cout<<“Sum=”<<Sum<<endl;}voidmain(){MyclassM(3,7,10),N(14,9,11);M.GetNumber();N.GetNumber();M.GetSum();N.GetSum();}Number=3,7,10Number=14,9,11Sum=54Sum=54目前十一頁(yè)\總數(shù)三十六頁(yè)\編于七點(diǎn)6.1.3靜態(tài)成員函數(shù)
靜態(tài)數(shù)據(jù)成員為類(lèi)屬性,在定義類(lèi)后、建立對(duì)象前就存在。因此,在建立對(duì)象前不能通過(guò)成員函數(shù)存取靜態(tài)數(shù)據(jù)成員。C++提供了靜態(tài)成員函數(shù),用來(lái)存取類(lèi)的靜態(tài)成員。靜態(tài)成員函數(shù)是用關(guān)鍵字static聲明的成員函數(shù),它屬于整個(gè)類(lèi)而不屬于類(lèi)中的某個(gè)對(duì)象,是該類(lèi)的所有對(duì)象共享的成員函數(shù)。靜態(tài)成員函數(shù)可以在類(lèi)體內(nèi)定義。也可以在類(lèi)內(nèi)聲明為static,在類(lèi)外定義。當(dāng)在類(lèi)外定義時(shí),不能再使用static關(guān)鍵字作為前綴。
靜態(tài)函數(shù)成員的調(diào)用形式有如下兩種:
(1)通過(guò)類(lèi)名調(diào)用靜態(tài)成員函數(shù);
(2)通過(guò)對(duì)象調(diào)用靜態(tài)成員函數(shù);目前十二頁(yè)\總數(shù)三十六頁(yè)\編于七點(diǎn)6.1.3靜態(tài)成員函數(shù)
(1)通過(guò)類(lèi)名調(diào)用靜態(tài)成員函數(shù)靜態(tài)函數(shù)成員為類(lèi)的全體對(duì)象而不是部分對(duì)象服務(wù),與類(lèi)相聯(lián)系而不與類(lèi)的對(duì)象聯(lián)系,因此訪問(wèn)靜態(tài)函數(shù)成員時(shí),可以直接使用類(lèi)名。格式如下:
對(duì)象.靜態(tài)成員函數(shù)
類(lèi)名::靜態(tài)成員函數(shù);(2)通過(guò)對(duì)象調(diào)用靜態(tài)成員函數(shù),格式為:注意:
通過(guò)類(lèi)名訪問(wèn)靜態(tài)成員函數(shù)不受靜態(tài)成員函數(shù)訪問(wèn)權(quán)限的控制。例p338目前十三頁(yè)\總數(shù)三十六頁(yè)\編于七點(diǎn)6.1.3靜態(tài)成員函數(shù)通過(guò)對(duì)象調(diào)用靜態(tài)成員函數(shù)應(yīng)注意:
通過(guò)對(duì)象訪問(wèn)靜態(tài)成員函數(shù)的前提條件為對(duì)象已經(jīng)建立。靜態(tài)成員函數(shù)的訪問(wèn)權(quán)限同普通成員函數(shù)一樣。靜態(tài)成員函數(shù)也可以省略參數(shù)、使用默認(rèn)形參值、以及進(jìn)行重載。靜態(tài)成員函數(shù)與普通成員函數(shù)在使用還有如下區(qū)別:由于靜態(tài)成員函數(shù)在類(lèi)中只有一個(gè)拷貝(副本),因此它訪問(wèn)對(duì)象的成員時(shí)要受到一些限制:靜態(tài)成員函數(shù)可以直接訪問(wèn)類(lèi)中說(shuō)明的靜態(tài)成員,但不能直接訪問(wèn)類(lèi)中的非靜態(tài)成員;若要訪問(wèn)非靜態(tài)成員,必須通過(guò)參數(shù)傳遞的方式得到相應(yīng)的對(duì)象,再通過(guò)對(duì)象來(lái)訪問(wèn)。由于靜態(tài)成員是獨(dú)立于類(lèi)對(duì)象而存在的,因此靜態(tài)成員沒(méi)有this指針。目前十四頁(yè)\總數(shù)三十六頁(yè)\編于七點(diǎn)12345678910111213141516/**************************************p7_9.cpp**含有對(duì)象計(jì)數(shù)器的學(xué)生類(lèi)**************************************/#include<iostream>usingnamespacestd;classStudent{private:char*Name;intNo;
staticintcountS;public:
staticintGetCount(){returncountS;}【例7-9】使用靜態(tài)成員維護(hù)內(nèi)存中Student類(lèi)對(duì)象的個(gè)數(shù)(對(duì)象計(jì)數(shù)器)。分析:為了維護(hù)內(nèi)存中Student類(lèi)對(duì)象的個(gè)數(shù),除了定義一個(gè)靜態(tài)數(shù)據(jù)成員存儲(chǔ)類(lèi)對(duì)象個(gè)數(shù)外,還要在所有可能建立對(duì)象、刪除對(duì)象的場(chǎng)合記載對(duì)對(duì)象個(gè)數(shù)的修改。靜態(tài)數(shù)據(jù)成員靜態(tài)成員函數(shù)目前十五頁(yè)\總數(shù)三十六頁(yè)\編于七點(diǎn)1718192021222324252627282930313233343536
Student(char*="",int=0);Student(Student&);~Student();};Student::Student(char*Name,intNo){this->Name=newchar[strlen(Name)+1];strcpy(this->Name,Name);this->No=No;
++countS;cout<<"constructing:"<<Name<<endl;}Student::Student(Student&r){Name=newchar[strlen(r.Name)+1];strcpy(Name,r.Name);No=r.No;++countS;cout<<"copyconstructing:"<<r.Name<<endl;}靜態(tài)數(shù)據(jù)成員p339目前十六頁(yè)\總數(shù)三十六頁(yè)\編于七點(diǎn)37383940414243444546474849505152535455565758
Student::~Student(){cout<<"destructing:"<<Name<<endl;delete[]Name;--countS;}intStudent::countS=0;intmain(){cout<<Student::GetCount()<<endl;//使用類(lèi)調(diào)用靜態(tài)成員函數(shù)
Students1("Antony");//建立一個(gè)新對(duì)象
cout<<s1.GetCount()<<endl;//通過(guò)對(duì)象調(diào)用靜態(tài)成員函數(shù)
Students2(s1);//利用已有對(duì)象建立一個(gè)新對(duì)象
cout<<s1.GetCount()<<endl;StudentS3[2];//建立一個(gè)對(duì)象數(shù)組
cout<<Student::GetCount()<<endl;Student*s4=newStudent[3];//建立一動(dòng)態(tài)對(duì)象數(shù)組
cout<<Student::GetCount()<<endl;delete[]s4;//刪除動(dòng)態(tài)對(duì)象數(shù)組
cout<<Student::GetCount()<<endl;return0;}運(yùn)行結(jié)果:0constructing:Antony1copyconstructing:Antony2constructing:constructing:4constructing:constructing:constructing:7destructing:destructing:destructing:4destructing:destructing:destructing:Antonydestructing:Antony目前十七頁(yè)\總數(shù)三十六頁(yè)\編于七點(diǎn)§6-2友元6.2.1需要友元的原因普通函數(shù)需要直接訪問(wèn)一個(gè)類(lèi)的保護(hù)或私有數(shù)據(jù)成員。友元提供了不同類(lèi)對(duì)象的成員函數(shù)之間、類(lèi)的成員函數(shù)與一般函數(shù)之間進(jìn)行數(shù)據(jù)共享的機(jī)制。即通過(guò)友元的方式,一個(gè)一般函數(shù)可以訪問(wèn)一個(gè)類(lèi)的私有數(shù)據(jù),一個(gè)類(lèi)可訪問(wèn)另一個(gè)類(lèi)的私有數(shù)據(jù)。方便編程,但破壞了類(lèi)的封裝。
友元不是類(lèi)的成員,但它可以訪問(wèn)類(lèi)的任何成員(包括私有成員)。聲明為友元的外界對(duì)象既可以是另一個(gè)類(lèi)的成員函數(shù),也可以是不屬于任何類(lèi)的一般的函數(shù),稱(chēng)之為友元函數(shù);友元也可以是整個(gè)的一個(gè)類(lèi),稱(chēng)之為友元類(lèi)。
目前十八頁(yè)\總數(shù)三十六頁(yè)\編于七點(diǎn)6.2.2友元函數(shù)
友元函數(shù)是在類(lèi)定義中由關(guān)鍵字friend修飾的非成員函數(shù)。其格式為:friend返回類(lèi)型函數(shù)名(形參表)
{
…//函數(shù)體
}注意:友元函數(shù)的定義與成員函數(shù)一樣,只是在類(lèi)中用關(guān)鍵字friend予以說(shuō)明。但友元函數(shù)是一個(gè)普通的函數(shù),它不是本類(lèi)的成員函數(shù),因此在調(diào)用時(shí)不能通過(guò)對(duì)象調(diào)用。友元函數(shù)也可以在類(lèi)內(nèi)聲明,在類(lèi)外定義。友元函數(shù)對(duì)類(lèi)成員的存取與成員函數(shù)一樣,可以直接存取類(lèi)的任何存取控制屬性的成員;可通過(guò)對(duì)象存取形參、函數(shù)體中該類(lèi)類(lèi)型對(duì)象的所有成員。private、protected、public訪問(wèn)權(quán)限與友員函數(shù)的聲明無(wú)關(guān),因此原則上,友元函數(shù)聲明可以放在類(lèi)體中任意部分,但為程序清晰,一般放在類(lèi)體的后面。目前十九頁(yè)\總數(shù)三十六頁(yè)\編于七點(diǎn)1234567891011121314/******************************************p7_10.cpp**計(jì)算火車(chē)旅途時(shí)間的友元函數(shù)******************************************/#include<iostream>usingnamespacestd;classClock{private:intH,M,S;public:
voidShowTime(){cout<<H<<":"<<M<<":"<<S<<endl; }
voidSetTime(intH=0,intM=0,intS=0){this->H=H,this->M=M,this->S=S; }【例】使用友元函數(shù)計(jì)算某次火車(chē)的旅途時(shí)間。分析:為了簡(jiǎn)化問(wèn)題,分別用兩個(gè)Clock類(lèi)對(duì)象表示某次火車(chē)出發(fā)時(shí)間、到達(dá)時(shí)間。假定火車(chē)均為24小時(shí)內(nèi)到達(dá),旅途時(shí)間為到達(dá)時(shí)間減出發(fā)時(shí)間。目前二十頁(yè)\總數(shù)三十六頁(yè)\編于七點(diǎn)1718192021222324252627282930313233Clock(intH=0,intM=0,intS=0){this->H=H,this->M=M,this->S=S;}
friendClockTripTime(Clock&StartTime,Clock&EndTime);};ClockTripTime(Clock&StartTime,Clock&EndTime){inttH,tM,tS;//臨時(shí)存儲(chǔ)小時(shí)、分、秒數(shù)
intcarry=0;//借位
ClocktTime;//臨時(shí)存儲(chǔ)時(shí)間
(tS=EndTime.S-StartTime.S)>0?carry=0:tS+=60,carry=1;(tM=EndTime.M-StartTime.M-carry)>0?carry=0:tM+=60,carry=1;(tH=EndTime.H-StartTime.H-carry)>0?carry=0:tH+=24;tTime.SetTime(tH,tM,tS);returntTime;}友元函數(shù)目前二十一頁(yè)\總數(shù)三十六頁(yè)\編于七點(diǎn)3435363738394041intmain(){ ClockC1(8,10,10),C2(6,1,2);//定義Clock類(lèi)的對(duì)象
ClockC3;//定義Clock類(lèi)對(duì)象,存儲(chǔ)結(jié)果
C3=TripTime(C1,C2); C3.ShowTime();return0;}運(yùn)行結(jié)果:21:50:52
說(shuō)明:在本例中,在Clock類(lèi)體中設(shè)計(jì)了一個(gè)友元函數(shù)TripTime(),它不是類(lèi)的成員函數(shù)。但是,可以看到友元函數(shù)中通過(guò)對(duì)象名StartTime和EndTime直接訪問(wèn)了它們的的私有數(shù)據(jù)。成員StartTime.H、StartTime.M、StartTime.S,這就是友元的關(guān)鍵所在。使用友元成員的好處是兩個(gè)類(lèi)可以某種方式相互合作、協(xié)同工作,共同完成某一任務(wù)。目前二十二頁(yè)\總數(shù)三十六頁(yè)\編于七點(diǎn)6.2.3友元類(lèi)
友元除可以是函數(shù)外,還可以是類(lèi),如果一個(gè)類(lèi)聲明為另一個(gè)類(lèi)的友元,則該類(lèi)稱(chēng)為另一個(gè)類(lèi)的友元類(lèi)。若A類(lèi)為B類(lèi)的友元類(lèi),則A類(lèi)的所有成員函數(shù)都是B類(lèi)的友元函數(shù),都可以訪問(wèn)B類(lèi)的任何數(shù)據(jù)成員。友元類(lèi)的聲明是在類(lèi)名之前加上關(guān)鍵字friend來(lái)實(shí)現(xiàn)。聲明A類(lèi)為B類(lèi)的友員類(lèi)的格式如下:classB{
…
friendclassA;};注意:
在聲明A類(lèi)為B類(lèi)的友元類(lèi)時(shí),A類(lèi)必須已經(jīng)存在,但是如果A類(lèi)又將B類(lèi)聲明為自己的友員類(lèi)時(shí),又會(huì)出現(xiàn)B類(lèi)不存在的錯(cuò)誤。目前二十三頁(yè)\總數(shù)三十六頁(yè)\編于七點(diǎn)6.2.3友元類(lèi)前向引用聲明:當(dāng)遇到兩個(gè)類(lèi)相互引用的情況時(shí),必然有一個(gè)類(lèi)在定義之前就將被引用,怎么辦呢?對(duì)此,C++專(zhuān)門(mén)規(guī)定了前向引用聲明用以解決這類(lèi)問(wèn)題,前向引用聲明是在引用未定義的類(lèi)之前對(duì)該類(lèi)進(jìn)行聲明,它只是為程序引入一個(gè)代表該類(lèi)的標(biāo)識(shí)符,類(lèi)的具體定義可以在程序的其他地方進(jìn)行。12345678910//前向引用聲明示例classB;//前向引用聲明
classA{//A類(lèi)的定義
public://外部接口
voidfunA(Bb);//以B類(lèi)對(duì)象b為形參的成員函數(shù)
};
classB{//B類(lèi)的定義
public://外部接口
voidfunB(Aa);//以A類(lèi)對(duì)象a為形參的成員函數(shù)
};目前二十四頁(yè)\總數(shù)三十六頁(yè)\編于七點(diǎn)12345678910111213/*************************************p7_11.cpp**計(jì)算火車(chē)旅途時(shí)間的友元類(lèi)*************************************/#include<iostream>usingnamespacestd;classTrainTrip;//前向引用聲明classClock{private:intH,M,S;public:
voidShowTime(){cout<<H<<":"<<M<<":"<<S<<endl; }【例7-11】使用友元類(lèi)計(jì)算某次火車(chē)的旅途時(shí)間。
分析:在p7_8.cpp中,定義了一個(gè)組合類(lèi)TrainTrip,組合了Clock類(lèi)對(duì)象表示某次火車(chē)出發(fā)時(shí)間、到達(dá)時(shí)間。但是,TrainTrip中的成員函數(shù)無(wú)法直接存取出發(fā)時(shí)間、到達(dá)時(shí)間中的訪問(wèn)控制為private的H、M、S。如果將TrainTrip定義為Clock的友員類(lèi),則TrainTrip中的成員函數(shù)可以直接存取出發(fā)時(shí)間、到達(dá)時(shí)間中的數(shù)據(jù)成員。
目前二十五頁(yè)\總數(shù)三十六頁(yè)\編于七點(diǎn)14151617181920212223242526272829303132333435
voidSetTime(intH=0,intM=0,intS=0){this->H=H,this->M=M,this->S=S;}
Clock(intH=0,intM=0,intS=0){this->H=H,this->M=M,this->S=S;}friendclassTrainTrip;};classTrainTrip{private:char*TrainNo;//車(chē)次
ClockStartTime;//出發(fā)時(shí)間
ClockEndTime;//到達(dá)時(shí)間public:
TrainTrip(char*TrainNo,ClockS,ClockE){ this->TrainNo=TrainNo;StartTime=S; EndTime=E;}目前二十六頁(yè)\總數(shù)三十六頁(yè)\編于七點(diǎn)36373839404142434445464748495051525354555657
ClockTripTime(){ inttH,tM,tS;//臨時(shí)存儲(chǔ)小時(shí)、分、秒數(shù)
intcarry=0;//借位
ClocktTime;//臨時(shí)存儲(chǔ)時(shí)間
(tS=EndTime.S-StartTime.S)>0?carry=0:tS+=60,carry=1;(tM=EndTime.M-StartTime.M-carry)>0?carry=0:tM+=60,carry=1;(tH=EndTime.H-StartTime.H-carry)>0?carry=0:tH+=24; tTime.SetTime(tH,tM,tS);returntTime;}};intmain(){ClockC1(8,10,10),C2(6,1,2); //定義Clock類(lèi)的對(duì)象
ClockC3;//定義Clock類(lèi)對(duì)象,存儲(chǔ)結(jié)果
TrainTripT1("K16",C1,C2); //定義TrainTrip對(duì)象
C3=T1.TripTime(); C3.ShowTime();return0;}運(yùn)行結(jié)果:21:50:52目前二十七頁(yè)\總數(shù)三十六頁(yè)\編于七點(diǎn)6.2.3友元類(lèi)友元關(guān)系具有以下性質(zhì):
友元關(guān)系是不能傳遞的,B類(lèi)是A類(lèi)的友元,C類(lèi)是B類(lèi)的友元,C類(lèi)和A類(lèi)之間,如果沒(méi)有聲明,就沒(méi)有任何友元關(guān)系,不能進(jìn)行數(shù)據(jù)共享。友元關(guān)系是單向的,如果聲明B類(lèi)是A類(lèi)的友元,B類(lèi)的成員函數(shù)就可以訪問(wèn)A類(lèi)的私有和保護(hù)數(shù)據(jù),但A類(lèi)的成員函數(shù)卻不能訪問(wèn)B類(lèi)的私有和保護(hù)數(shù)據(jù)。友元概念的引入,提高了數(shù)據(jù)的共享性,加強(qiáng)了函數(shù)與函數(shù)之間,類(lèi)與類(lèi)之間的相互聯(lián)系,大大提高程序的效率,這是友元的優(yōu)點(diǎn),但友元也破壞了數(shù)據(jù)隱蔽和數(shù)據(jù)封裝,導(dǎo)致程序的可維護(hù)性變差,給程序的重用和擴(kuò)充埋下了深深的隱患,這是友元的缺點(diǎn)。對(duì)友元的使用必須慎重,要具體問(wèn)題具體分析,在提高效率和增加共享之間把握好一個(gè)“度”,在共享和封裝之間進(jìn)行恰當(dāng)?shù)恼壑云胶狻?/p>
目前二十八頁(yè)\總數(shù)三十六頁(yè)\編于七點(diǎn)6.3Const數(shù)據(jù)保護(hù)
由于常量是不可改變的,因此我們將“常”廣泛用在C++中用來(lái)表示不可改變的量,如前面講的常變量。不僅變量可以定義為常變量,對(duì)象、類(lèi)的成員也可以定義為“?!薄T诔绦蛑?,我們有時(shí)候不允許修改某些特定的對(duì)象。如果某個(gè)對(duì)象不允許被修改,則該對(duì)象稱(chēng)為常對(duì)象。C++用關(guān)鍵字const來(lái)定義常對(duì)象。
const也可以用來(lái)限定類(lèi)的數(shù)據(jù)成員和成員函數(shù),分別稱(chēng)為類(lèi)的常數(shù)據(jù)成員和常函數(shù)成員。C++中常對(duì)象、常數(shù)據(jù)成員、常成員函數(shù)的訪問(wèn)和調(diào)用各有其特別之處。常對(duì)象和常成員概念的建立,明確規(guī)定了程序中各種對(duì)象的變與不變的界線,從而進(jìn)一步增強(qiáng)了C++程序的安全性和可控性。目前二十九頁(yè)\總數(shù)三十六頁(yè)\編于七點(diǎn)6.3Const數(shù)據(jù)保護(hù)
6.3.1
常引用在說(shuō)明引用時(shí)用const修飾常引用所引用的對(duì)象不能被更新#include<iostream.h>voiddisplay(constdouble&);intmain(){doubled=9.5;display(d);return0;}voiddisplay(constdouble&r){r=10.5;×cout<<r<<endl;√}目前三十頁(yè)\總數(shù)三十六頁(yè)\編于七點(diǎn)6.3.2常對(duì)象C++編譯器對(duì)常對(duì)象(const對(duì)象)的使用是極為苛刻的,它不允許常對(duì)象調(diào)用任何類(lèi)的成員函數(shù),而且常對(duì)象一旦定義,在其生存期內(nèi)不允許改變,否則將導(dǎo)致編譯錯(cuò)誤。常對(duì)象定義格式如下:
類(lèi)型const對(duì)象名;
或
const類(lèi)型對(duì)象名;1234567891011intmain(){
constClockC1(9,9,9);//定義常對(duì)象C1ClockconstC2(10,10,10);//定義常對(duì)象C2ClockC3(11,11,11);//C1=C3;//錯(cuò)誤!C1為常對(duì)象,不能被賦值
//C1.ShowTime();//錯(cuò)誤!C1為常對(duì)象,不能訪問(wèn)非常成員函數(shù)
C3.ShowTime();//C1.SetTime(0,0,0);//錯(cuò)誤!C1為常對(duì)象,不能被更新!
return0;}目前三十一頁(yè)\總數(shù)三十六頁(yè)\編于七點(diǎn)6.3.3常數(shù)據(jù)成員
使用const說(shuō)明的數(shù)據(jù)成員稱(chēng)為常數(shù)據(jù)成員。常數(shù)據(jù)成員的定義與一般常變量的定義方式相同,只是它的定義必須出現(xiàn)在類(lèi)體中。常數(shù)據(jù)成員同樣也必須進(jìn)行初始化,并且不能被更新。但常數(shù)據(jù)成員的初始化只能通過(guò)構(gòu)造函數(shù)的初始化列表進(jìn)行。常數(shù)據(jù)成員定義的格式如下:
數(shù)據(jù)類(lèi)型
const數(shù)據(jù)成員名;或
const數(shù)據(jù)類(lèi)型數(shù)據(jù)成員名;目前三十二頁(yè)\總數(shù)三十六頁(yè)\編于七點(diǎn)1234567891011121314151617#include<iostre
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 新標(biāo)準(zhǔn)小學(xué)四年級(jí)英語(yǔ)教學(xué)計(jì)劃評(píng)估方案
- 2025-2030年中國(guó)機(jī)床改造維修行業(yè)深度研究分析報(bào)告
- 2025-2030年中國(guó)制磚瓦機(jī)行業(yè)深度研究分析報(bào)告
- 2024-2030全球采礦撬毛臺(tái)車(chē)行業(yè)調(diào)研及趨勢(shì)分析報(bào)告
- 2025-2030年中國(guó)電鏟鋼絲繩項(xiàng)目投資可行性研究分析報(bào)告
- 計(jì)算機(jī)信息服務(wù)項(xiàng)目風(fēng)險(xiǎn)識(shí)別與評(píng)估綜合報(bào)告
- 婚紗攝影工作室拍攝預(yù)約合同
- 智慧停車(chē)系統(tǒng)操作設(shè)計(jì)方案,1200字
- 貿(mào)易公司購(gòu)銷(xiāo)合同
- 跨國(guó)公司合同評(píng)審流程及挑戰(zhàn)
- 中國(guó)河流湖泊
- PID控制原理內(nèi)容知識(shí)
- 建設(shè)工程廉政風(fēng)險(xiǎn)防控手冊(cè)
- 軍事地形學(xué)知識(shí)總結(jié)
- 云南省普通初中學(xué)生成長(zhǎng)記錄-基本素質(zhì)發(fā)展初一-初三
- GB 6944-2012 危險(xiǎn)貨物分類(lèi)和品名編號(hào)(高清版)
- IT行業(yè)薪酬管理制度示例某軟件公司薪酬體系設(shè)計(jì)方案
- 香港正版全年綜合資料
- 外貿(mào)報(bào)關(guān)用發(fā)票、裝箱單、合同、報(bào)關(guān)單模板
- 確認(rèn)民族成分申請(qǐng)書(shū)
- 工作區(qū)子系統(tǒng)設(shè)計(jì)案例一
評(píng)論
0/150
提交評(píng)論