版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
靜態(tài)成員與友元演示文稿當(dāng)前1頁(yè),總共36頁(yè)。優(yōu)選靜態(tài)成員與友元當(dāng)前2頁(yè),總共36頁(yè)。靜態(tài)成員與友元
學(xué)習(xí)本章后,應(yīng)該掌握聲明靜態(tài)數(shù)據(jù)成員,掌握使用靜態(tài)成員函數(shù)以及靜態(tài)成員函數(shù)與特定對(duì)象無(wú)關(guān)的特性。把握友元的使用,理解友元作用的局限性。當(dāng)前3頁(yè),總共36頁(yè)。第六章靜態(tài)成員與友元函數(shù)
§6-1靜態(tài)成員
§6-2友元
§6-3const數(shù)據(jù)保護(hù)當(dāng)前4頁(yè),總共36頁(yè)?!?-1靜態(tài)成員
6.1.1靜態(tài)成員的需要性有一些屬性是類中所有成員所共有的,屬于類的一部分,但既不適于用普通成員表示,也不適于全局變量表示的數(shù)據(jù),用靜態(tài)成員表示。對(duì)象個(gè)數(shù)對(duì)象鏈表頭、尾指針類的狀態(tài)一個(gè)類對(duì)象的public成員可被本類的其他對(duì)象存取,即可供所有對(duì)象使用,但是此類的每個(gè)對(duì)象都各自擁有一份,不存在真正意義上的共享成員。所以,C++提供了靜態(tài)成員,用以解決同一個(gè)類的不同對(duì)象之間數(shù)據(jù)成員和函數(shù)的共享問(wèn)題。當(dāng)前5頁(yè),總共36頁(yè)?!?-1靜態(tài)成員
聲明為static的類成員為靜態(tài)成員,解決同一個(gè)類的不同對(duì)象之間的數(shù)據(jù)和函數(shù)共享問(wèn)題。靜態(tài)成員的特點(diǎn)是:不管這個(gè)類創(chuàng)建了多少個(gè)對(duì)象,其靜態(tài)成員在內(nèi)存中只保留一份拷貝,這個(gè)拷貝為該類的所有對(duì)象所共享。類的靜態(tài)成員有兩種:靜態(tài)數(shù)據(jù)成員和靜態(tài)函數(shù)成員,下面分別對(duì)它們進(jìn)行討論。當(dāng)前6頁(yè),總共36頁(yè)。6.1.2靜態(tài)數(shù)據(jù)成員
面向?qū)ο蠓椒ㄖ羞€有類屬性(classattribute)的概念,類屬性是描述類的所有對(duì)象的共同特征的一個(gè)數(shù)據(jù)項(xiàng),對(duì)于任何對(duì)象實(shí)例,它的屬性值是相同的,C++通過(guò)靜態(tài)數(shù)據(jù)成員來(lái)實(shí)現(xiàn)類屬性。靜態(tài)數(shù)據(jù)成員:是類的數(shù)據(jù)成員的一種特例,采用static關(guān)鍵字來(lái)定義,屬于類屬性,每個(gè)類只有一個(gè)拷貝,由該類的所有對(duì)象共同維護(hù)和使用,從而實(shí)現(xiàn)了同類的不同對(duì)象之間的數(shù)據(jù)共享。
當(dāng)前7頁(yè),總共36頁(yè)。6.1.2靜態(tài)數(shù)據(jù)成員
靜態(tài)數(shù)據(jù)成員的定義分為兩個(gè)必不可少的部分:類內(nèi)聲明、類外初始化。在類內(nèi),聲明靜態(tài)數(shù)據(jù)成員的格式為:
數(shù)據(jù)類型類名::靜態(tài)數(shù)據(jù)成員名=初始值;
static
數(shù)據(jù)類型靜態(tài)數(shù)據(jù)成員名;
在類外初始化的形式為:
除了在初始化時(shí)可以在類外通過(guò)類對(duì)靜態(tài)成員賦初值外,其他情況下對(duì)靜態(tài)成員的存取規(guī)則與一般成員相同。即:在類內(nèi)可以任意存??;在類外,通過(guò)對(duì)象只能訪問(wèn)存取屬性為public的成員。
當(dāng)前8頁(yè),總共36頁(yè)。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ù)成員,它表示類屬性,而不是某個(gè)對(duì)象單獨(dú)的屬性,它在程序開(kāi)始產(chǎn)生,在程序結(jié)束時(shí)消失。靜態(tài)數(shù)據(jù)成員具有靜態(tài)生存期。由于在類的定義中僅僅是對(duì)靜態(tài)數(shù)據(jù)成員進(jìn)行了引用性聲明,因此必須在文件作用域的某個(gè)地方對(duì)靜態(tài)數(shù)據(jù)成員進(jìn)行定義并初始化,即應(yīng)在類體外對(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ù)成員是類的成員,因此在初始化時(shí)必須使用類作用域運(yùn)算符::限定它所屬的類。當(dāng)前9頁(yè),總共36頁(yè)。12345678classStudent{private:char*Name;intNo;
staticintcountS;};//在類外對(duì)靜態(tài)成員初始化如下:intStudent::countS=0;例如:我們對(duì)某學(xué)校不同學(xué)生的特性進(jìn)行抽象,找出共性設(shè)計(jì)一個(gè)學(xué)生類Student,如果需要統(tǒng)計(jì)學(xué)生的總?cè)藬?shù),可以在類外定義一個(gè)全局變量。但是類外的全局變量不受類存取控制的保護(hù)。因此可以將學(xué)生人數(shù)定義為靜態(tài)成員,即學(xué)生類的類屬性,設(shè)計(jì)的Student類如下:注意:
對(duì)靜態(tài)數(shù)據(jù)成員的訪問(wèn)還可以通過(guò)類的成員函數(shù)來(lái)進(jìn)行。
6.1.2靜態(tài)數(shù)據(jù)成員P335例子當(dāng)前10頁(yè),總共36頁(yè)。#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當(dāng)前11頁(yè),總共36頁(yè)。6.1.3靜態(tài)成員函數(shù)
靜態(tài)數(shù)據(jù)成員為類屬性,在定義類后、建立對(duì)象前就存在。因此,在建立對(duì)象前不能通過(guò)成員函數(shù)存取靜態(tài)數(shù)據(jù)成員。C++提供了靜態(tài)成員函數(shù),用來(lái)存取類的靜態(tài)成員。靜態(tài)成員函數(shù)是用關(guān)鍵字static聲明的成員函數(shù),它屬于整個(gè)類而不屬于類中的某個(gè)對(duì)象,是該類的所有對(duì)象共享的成員函數(shù)。靜態(tài)成員函數(shù)可以在類體內(nèi)定義。也可以在類內(nèi)聲明為static,在類外定義。當(dāng)在類外定義時(shí),不能再使用static關(guān)鍵字作為前綴。
靜態(tài)函數(shù)成員的調(diào)用形式有如下兩種:
(1)通過(guò)類名調(diào)用靜態(tài)成員函數(shù);
(2)通過(guò)對(duì)象調(diào)用靜態(tài)成員函數(shù);當(dāng)前12頁(yè),總共36頁(yè)。6.1.3靜態(tài)成員函數(shù)
(1)通過(guò)類名調(diào)用靜態(tài)成員函數(shù)靜態(tài)函數(shù)成員為類的全體對(duì)象而不是部分對(duì)象服務(wù),與類相聯(lián)系而不與類的對(duì)象聯(lián)系,因此訪問(wèn)靜態(tài)函數(shù)成員時(shí),可以直接使用類名。格式如下:
對(duì)象.靜態(tài)成員函數(shù)
類名::靜態(tài)成員函數(shù);(2)通過(guò)對(duì)象調(diào)用靜態(tài)成員函數(shù),格式為:注意:
通過(guò)類名訪問(wèn)靜態(tài)成員函數(shù)不受靜態(tài)成員函數(shù)訪問(wèn)權(quán)限的控制。例p338當(dāng)前13頁(yè),總共36頁(yè)。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ù)在類中只有一個(gè)拷貝(副本),因此它訪問(wèn)對(duì)象的成員時(shí)要受到一些限制:靜態(tài)成員函數(shù)可以直接訪問(wèn)類中說(shuō)明的靜態(tài)成員,但不能直接訪問(wèn)類中的非靜態(tài)成員;若要訪問(wèn)非靜態(tài)成員,必須通過(guò)參數(shù)傳遞的方式得到相應(yīng)的對(duì)象,再通過(guò)對(duì)象來(lái)訪問(wèn)。由于靜態(tài)成員是獨(dú)立于類對(duì)象而存在的,因此靜態(tài)成員沒(méi)有this指針。當(dāng)前14頁(yè),總共36頁(yè)。12345678910111213141516/**************************************p7_9.cpp**含有對(duì)象計(jì)數(shù)器的學(xué)生類**************************************/#include<iostream>usingnamespacestd;classStudent{private:char*Name;intNo;
staticintcountS;public:
staticintGetCount(){returncountS;}【例7-9】使用靜態(tài)成員維護(hù)內(nèi)存中Student類對(duì)象的個(gè)數(shù)(對(duì)象計(jì)數(shù)器)。分析:為了維護(hù)內(nèi)存中Student類對(duì)象的個(gè)數(shù),除了定義一個(gè)靜態(tài)數(shù)據(jù)成員存儲(chǔ)類對(duì)象個(gè)數(shù)外,還要在所有可能建立對(duì)象、刪除對(duì)象的場(chǎng)合記載對(duì)對(duì)象個(gè)數(shù)的修改。靜態(tài)數(shù)據(jù)成員靜態(tài)成員函數(shù)當(dāng)前15頁(yè),總共36頁(yè)。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當(dāng)前16頁(yè),總共36頁(yè)。37383940414243444546474849505152535455565758
Student::~Student(){cout<<"destructing:"<<Name<<endl;delete[]Name;--countS;}intStudent::countS=0;intmain(){cout<<Student::GetCount()<<endl;//使用類調(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當(dāng)前17頁(yè),總共36頁(yè)。§6-2友元6.2.1需要友元的原因
普通函數(shù)需要直接訪問(wèn)一個(gè)類的保護(hù)或私有數(shù)據(jù)成員。友元提供了不同類對(duì)象的成員函數(shù)之間、類的成員函數(shù)與一般函數(shù)之間進(jìn)行數(shù)據(jù)共享的機(jī)制。即通過(guò)友元的方式,一個(gè)一般函數(shù)可以訪問(wèn)一個(gè)類的私有數(shù)據(jù),一個(gè)類可訪問(wèn)另一個(gè)類的私有數(shù)據(jù)。方便編程,但破壞了類的封裝。
友元不是類的成員,但它可以訪問(wèn)類的任何成員(包括私有成員)。聲明為友元的外界對(duì)象既可以是另一個(gè)類的成員函數(shù),也可以是不屬于任何類的一般的函數(shù),稱之為友元函數(shù);友元也可以是整個(gè)的一個(gè)類,稱之為友元類。
當(dāng)前18頁(yè),總共36頁(yè)。6.2.2友元函數(shù)
友元函數(shù)是在類定義中由關(guān)鍵字friend修飾的非成員函數(shù)。其格式為:friend返回類型函數(shù)名(形參表)
{
…//函數(shù)體
}注意:友元函數(shù)的定義與成員函數(shù)一樣,只是在類中用關(guān)鍵字friend予以說(shuō)明。但友元函數(shù)是一個(gè)普通的函數(shù),它不是本類的成員函數(shù),因此在調(diào)用時(shí)不能通過(guò)對(duì)象調(diào)用。友元函數(shù)也可以在類內(nèi)聲明,在類外定義。友元函數(shù)對(duì)類成員的存取與成員函數(shù)一樣,可以直接存取類的任何存取控制屬性的成員;可通過(guò)對(duì)象存取形參、函數(shù)體中該類類型對(duì)象的所有成員。private、protected、public訪問(wèn)權(quán)限與友員函數(shù)的聲明無(wú)關(guān),因此原則上,友元函數(shù)聲明可以放在類體中任意部分,但為程序清晰,一般放在類體的后面。當(dāng)前19頁(yè),總共36頁(yè)。1234567891011121314/******************************************p7_10.cpp**計(jì)算火車旅途時(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ì)算某次火車的旅途時(shí)間。分析:為了簡(jiǎn)化問(wèn)題,分別用兩個(gè)Clock類對(duì)象表示某次火車出發(fā)時(shí)間、到達(dá)時(shí)間。假定火車均為24小時(shí)內(nèi)到達(dá),旅途時(shí)間為到達(dá)時(shí)間減出發(fā)時(shí)間。當(dāng)前20頁(yè),總共36頁(yè)。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ù)當(dāng)前21頁(yè),總共36頁(yè)。3435363738394041intmain(){ ClockC1(8,10,10),C2(6,1,2);//定義Clock類的對(duì)象
ClockC3;//定義Clock類對(duì)象,存儲(chǔ)結(jié)果
C3=TripTime(C1,C2); C3.ShowTime();return0;}運(yùn)行結(jié)果:21:50:52
說(shuō)明:在本例中,在Clock類體中設(shè)計(jì)了一個(gè)友元函數(shù)TripTime(),它不是類的成員函數(shù)。但是,可以看到友元函數(shù)中通過(guò)對(duì)象名StartTime和EndTime直接訪問(wèn)了它們的的私有數(shù)據(jù)。成員StartTime.H、StartTime.M、StartTime.S,這就是友元的關(guān)鍵所在。使用友元成員的好處是兩個(gè)類可以某種方式相互合作、協(xié)同工作,共同完成某一任務(wù)。當(dāng)前22頁(yè),總共36頁(yè)。6.2.3友元類
友元除可以是函數(shù)外,還可以是類,如果一個(gè)類聲明為另一個(gè)類的友元,則該類稱為另一個(gè)類的友元類。若A類為B類的友元類,則A類的所有成員函數(shù)都是B類的友元函數(shù),都可以訪問(wèn)B類的任何數(shù)據(jù)成員。友元類的聲明是在類名之前加上關(guān)鍵字friend來(lái)實(shí)現(xiàn)。聲明A類為B類的友員類的格式如下:classB{
…
friendclassA;};注意:
在聲明A類為B類的友元類時(shí),A類必須已經(jīng)存在,但是如果A類又將B類聲明為自己的友員類時(shí),又會(huì)出現(xiàn)B類不存在的錯(cuò)誤。當(dāng)前23頁(yè),總共36頁(yè)。6.2.3友元類前向引用聲明:當(dāng)遇到兩個(gè)類相互引用的情況時(shí),必然有一個(gè)類在定義之前就將被引用,怎么辦呢?對(duì)此,C++專門(mén)規(guī)定了前向引用聲明用以解決這類問(wèn)題,前向引用聲明是在引用未定義的類之前對(duì)該類進(jìn)行聲明,它只是為程序引入一個(gè)代表該類的標(biāo)識(shí)符,類的具體定義可以在程序的其他地方進(jìn)行。12345678910//前向引用聲明示例classB;//前向引用聲明
classA{//A類的定義
public://外部接口
voidfunA(Bb);//以B類對(duì)象b為形參的成員函數(shù)
};
classB{//B類的定義
public://外部接口
voidfunB(Aa);//以A類對(duì)象a為形參的成員函數(shù)
};當(dāng)前24頁(yè),總共36頁(yè)。12345678910111213/*************************************p7_11.cpp**計(jì)算火車旅途時(shí)間的友元類*************************************/#include<iostream>usingnamespacestd;classTrainTrip;//前向引用聲明classClock{private:intH,M,S;public:
voidShowTime(){cout<<H<<":"<<M<<":"<<S<<endl; }【例7-11】使用友元類計(jì)算某次火車的旅途時(shí)間。
分析:在p7_8.cpp中,定義了一個(gè)組合類TrainTrip,組合了Clock類對(duì)象表示某次火車出發(fā)時(shí)間、到達(dá)時(shí)間。但是,TrainTrip中的成員函數(shù)無(wú)法直接存取出發(fā)時(shí)間、到達(dá)時(shí)間中的訪問(wèn)控制為private的H、M、S。如果將TrainTrip定義為Clock的友員類,則TrainTrip中的成員函數(shù)可以直接存取出發(fā)時(shí)間、到達(dá)時(shí)間中的數(shù)據(jù)成員。
當(dāng)前25頁(yè),總共36頁(yè)。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;//車次
ClockStartTime;//出發(fā)時(shí)間
ClockEndTime;//到達(dá)時(shí)間public:
TrainTrip(char*TrainNo,ClockS,ClockE){ this->TrainNo=TrainNo;StartTime=S; EndTime=E;}當(dāng)前26頁(yè),總共36頁(yè)。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類的對(duì)象
ClockC3;//定義Clock類對(duì)象,存儲(chǔ)結(jié)果
TrainTripT1("K16",C1,C2); //定義TrainTrip對(duì)象
C3=T1.TripTime(); C3.ShowTime();return0;}運(yùn)行結(jié)果:21:50:52當(dāng)前27頁(yè),總共36頁(yè)。6.2.3友元類友元關(guān)系具有以下性質(zhì):
友元關(guān)系是不能傳遞的,B類是A類的友元,C類是B類的友元,C類和A類之間,如果沒(méi)有聲明,就沒(méi)有任何友元關(guān)系,不能進(jìn)行數(shù)據(jù)共享。友元關(guān)系是單向的,如果聲明B類是A類的友元,B類的成員函數(shù)就可以訪問(wèn)A類的私有和保護(hù)數(shù)據(jù),但A類的成員函數(shù)卻不能訪問(wèn)B類的私有和保護(hù)數(shù)據(jù)。友元概念的引入,提高了數(shù)據(jù)的共享性,加強(qiáng)了函數(shù)與函數(shù)之間,類與類之間的相互聯(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>
當(dāng)前28頁(yè),總共36頁(yè)。6.3Const數(shù)據(jù)保護(hù)
由于常量是不可改變的,因此我們將“?!睆V泛用在C++中用來(lái)表示不可改變的量,如前面講的常變量。不僅變量可以定義為常變量,對(duì)象、類的成員也可以定義為“?!?。在程序中,我們有時(shí)候不允許修改某些特定的對(duì)象。如果某個(gè)對(duì)象不允許被修改,則該對(duì)象稱為常對(duì)象。C++用關(guān)鍵字const來(lái)定義常對(duì)象。
const也可以用來(lái)限定類的數(shù)據(jù)成員和成員函數(shù),分別稱為類的常數(shù)據(jù)成員和常函數(shù)成員。C++中常對(duì)象、常數(shù)據(jù)成員、常成員函數(shù)的訪問(wèn)和調(diào)用各有其特別之處。常對(duì)象和常成員概念的建立,明確規(guī)定了程序中各種對(duì)象的變與不變的界線,從而進(jìn)一步增強(qiáng)了C++程序的安全性和可控性。當(dāng)前29頁(yè),總共36頁(yè)。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;√}當(dāng)前30頁(yè),總共36頁(yè)。6.3.2常對(duì)象
C++編譯器對(duì)常對(duì)象(const對(duì)象)的使用是極為苛刻的,它不允許常對(duì)象調(diào)用任何類的成員函數(shù),而且常對(duì)象一旦定義,在其生存期內(nèi)不允許改變,否則將導(dǎo)致編譯錯(cuò)誤。常對(duì)象定義格式如下:
類型const對(duì)象名;
或
const類型對(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;}當(dāng)前31頁(yè),總共36頁(yè)。6.3.3常數(shù)據(jù)成員
使用const說(shuō)明的數(shù)據(jù)成員稱為常數(shù)據(jù)成員。常數(shù)據(jù)成員的定義與一般常變量的定義方式相同,只是它的定義必須出現(xiàn)在類體中。常數(shù)據(jù)成員同樣也必須進(jìn)行初始化,并且不能被更新。但常數(shù)據(jù)成員的初始化只能通過(guò)構(gòu)造函數(shù)的初始化列表進(jìn)行。常數(shù)據(jù)成員定義的格式如下:
數(shù)據(jù)類型
const數(shù)據(jù)成員名;或
const數(shù)據(jù)類型數(shù)據(jù)成員名;當(dāng)前32頁(yè),總共36頁(yè)。1234567891011121314151617#include<i
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年度房地產(chǎn)項(xiàng)目投資分析委托合同3篇
- 銷售活動(dòng)方案策劃書(shū)
- 物聯(lián)網(wǎng)公有云下流量分析-洞察分析
- 2024年有限責(zé)任公司增資擴(kuò)股、健康醫(yī)療產(chǎn)業(yè)合作及市場(chǎng)拓展協(xié)議3篇
- 印刷質(zhì)量管理-洞察分析
- 2024年度地?zé)岬匕骞こ贪惭b與維護(hù)服務(wù)協(xié)議3篇
- 采購(gòu)合同的履行保障3篇
- 采購(gòu)合同跟蹤的案例分析與策略研究3篇
- 采購(gòu)合同預(yù)付款的信用風(fēng)險(xiǎn)管理3篇
- 采購(gòu)合同會(huì)審制度的特點(diǎn)分析3篇
- 互聯(lián)網(wǎng)金融(同濟(jì)大學(xué))智慧樹(shù)知到期末考試答案章節(jié)答案2024年同濟(jì)大學(xué)
- 2023-2024學(xué)年高考英語(yǔ)真題復(fù)習(xí)-定語(yǔ)從句(附解析)
- 游遍亞運(yùn)參賽國(guó)(地區(qū))智慧樹(shù)知到期末考試答案2024年
- 綜合布線實(shí)訓(xùn)實(shí)驗(yàn)報(bào)告
- 2024HW藍(lán)紅攻防網(wǎng)絡(luò)安全防御體系
- 4-4環(huán)網(wǎng)柜倒閘操作票填寫(xiě)與執(zhí)行
- 農(nóng)村污水處理設(shè)施運(yùn)維方案服務(wù)承諾及質(zhì)量保證
- 2024年中國(guó)人民保險(xiǎn)人保投資控股有限公司招聘筆試參考題庫(kù)含答案解析
- (高清版)DZT 0211-2020 礦產(chǎn)地質(zhì)勘查規(guī)范 重晶石、毒重石、螢石、硼
- 人身侵權(quán)案例課件
- 初中生無(wú)神論專題教育課件
評(píng)論
0/150
提交評(píng)論