靜態(tài)成員與友元_第1頁(yè)
靜態(tài)成員與友元_第2頁(yè)
靜態(tài)成員與友元_第3頁(yè)
靜態(tài)成員與友元_第4頁(yè)
靜態(tài)成員與友元_第5頁(yè)
已閱讀5頁(yè),還剩31頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論