OOP(C++)-第6章-類成員(2)(最終版)_第1頁
OOP(C++)-第6章-類成員(2)(最終版)_第2頁
OOP(C++)-第6章-類成員(2)(最終版)_第3頁
OOP(C++)-第6章-類成員(2)(最終版)_第4頁
OOP(C++)-第6章-類成員(2)(最終版)_第5頁
已閱讀5頁,還剩26頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

第六章類成員(二)面向?qū)ο蟪绦蛟O(shè)計(jì)(C++)6類成員(二)6.1成員變量與成員函數(shù)6.2this指針6.3成員對象6.4const(常量)6.5const對象與const成員函數(shù)6.6靜態(tài)成員變量與靜態(tài)成員函數(shù)6.4const量(常量)從高質(zhì)量程序設(shè)計(jì)的角度考察C++中的const!6.4.1const的意義最低權(quán)限原則:軟件工程的基本原則之一。

const的意義:在可更改與不可更改之間畫一條明確的界線,提高程序的安全性和可控性。

eg:

constinti=100;i++;//編譯錯(cuò)誤

6.4.2C中的const(常量)“一個(gè)不能被改變的普通變量”。因此:

--總是占用存儲;

--名字是全局的。也就是說,默認(rèn)情況下,const是外部連接的(容易引起“名字沖突”)。

constint

bufsize;//無需初始化

constint

bufsize=100;charbuf[bufsize];//error!!Why??

在編譯時(shí),編譯器并不知道const的值,它只是一個(gè)“運(yùn)行時(shí)常量”。6.4.3C++的Const通常,C++編譯器不為const創(chuàng)建存儲空間,而是把它保存在“符號表”里,即“編譯時(shí)常量”。

constint

bufsize;//非法,未賦初值

constint

bufsize=100;charstrbuf[bufsize];//OK,Why?默認(rèn)情況下,C++中的const是內(nèi)部連接的,也就是說,const僅在const被定義過的文件里才是可見的。(因此,不用擔(dān)心名字沖突)當(dāng)定義一個(gè)const時(shí),必須賦一個(gè)值給它,除非用extern做出了清楚的說明。當(dāng)用extern說明了const時(shí),編譯器會強(qiáng)制為const分配空間,而不是保存在符號表中。

externconstint

bufsize;//未賦初值,但extern聲明

了bufsize在另一個(gè)文件

中定義及賦初值。6.4.3C++的Const(續(xù))const用于集合,必須為其分配內(nèi)存,(因?yàn)榫幾g器“不愿意”把集合保存到符號表中,太復(fù)雜)。

constinti[]={1,2,3,4};floatf[i[3]];//非法,編譯期間無法知道存儲空間的值。

structS{inti,j;};constSs[]={{1,2},{3,4}};doubled[s[1].j];//非法,理由同上

intmain(){}///:~

6.4.4C++中const的作用值替代:C++的const

vs

C中的宏替換

#defineBUFSIZE100;//宏替換

charstr[BUFSIZE];

vsconstint

bufsize=100;//C++的constcharstr[bufsize];

在宏替換中,BUFSIZE沒有類型信息,不能進(jìn)行類型檢查;宏定義是全局的,容易名字沖突。6.4.4C++中const的作用(續(xù))

安全性如果想用運(yùn)行期間產(chǎn)生的值初始化一個(gè)變量,并且知道在該變量的生命期內(nèi)其值不變,則可用const限定該變量,達(dá)到最大限度地保證改變量安全性的目的。intmain(){

cout<<"typeacharacter&CR:";constcharc=cin.get();//用運(yùn)行期間產(chǎn)生的值初始化,之后不變

constcharc2=c+'a';

cout<<c2;}///:~

6.4.5const的應(yīng)用:const指針1.指向const的指針(指針指向的內(nèi)存地址的值不能改變)

constint*u;

//u是一個(gè)指針,它指向constint;intconst*v;//v是一個(gè)指向恰好是const的int的普通指針;

2.const指針(指針的值不能改變)constintd=1;int*constw=&d;//w是一個(gè)指針,這個(gè)指針是指向int的const指針

注意:C++中,const指針必須賦初值6.4.5const的應(yīng)用:const指針(續(xù))3.const指針指向const對象

intd=1;constint*constx=&d;intconst*constx2=&d;

//x,x2,*x,*x2都不能改變非const對象的地址可以賦給const指針;const對象的地址絕不可以賦給非const指針。

(因?yàn)檫@樣做可能導(dǎo)致通過非const指針改變const對象的值的后果)intd=1;constinte=2;int*u=&d;//OK--dnotconst//!int*v=&e;//illegal--econstint*w=(int*)&e;//legalbutbadpracticeintmain(){}///:~注意6.4.6const的應(yīng)用:const參數(shù)1.傳遞const值voidf1(constinti){i++;//編譯時(shí)錯(cuò)誤,i不能改變}

“形參”不能被改變or“實(shí)參”不能被改變???

6.4.7const的應(yīng)用:const返回值2.按值返回內(nèi)部const常量intf3(){return1;}constintf4(){return1;}//返回constint;intmain(){constintj=f3();//Worksfineintk=f4();//Butthisworksfinetoo!}///:~對內(nèi)部類型來說,按值返回const量并沒有什么特別的意義。6.4.7const的應(yīng)用:const返回值(續(xù))3.按值返回自定義類型的const:

實(shí)際上阻止了返回值作為左值出現(xiàn)。

classX{inti;public:X(intii=0);voidmodify();};X::X(intii){i=ii;}voidX::modify(){i++;}

Xf5(){Xx(2)returnx;//返回變量}constXf6(){returnX();//按值返回const;}voidf7(X&x){//按值傳遞非const引用x.modify();}intmain(){f5()=X(1);//正確,f5()返回非const量;f5().modify();//正確f7(f5());//可能會有Warning,跟編譯選項(xiàng)有關(guān)f6()=X(1);//Error:f6()是常量,不能作左值f6().modify();//Error:f6()是常量,不能被修改f7(f6());//Error:Why??}///:~error2664:cannotconvertparameter1from'constclassX'to'classX&'6.4.7const的應(yīng)用:const指針4.傳遞和返回const指針

char*strcpy(char*dest,constchar*src);voidt(int*){}voidu(constint*cip){*cip=2;//Error:試圖改變值

inti=*cip;//OK--copiesvalueint*ip2=cip;//Error:試圖讓非const*指向const*}constint*constw(){staticinti;return&i;//返回靜態(tài)局部量的地址}intmain(){intx=0;int*ip=&x;constint*cip=&x;t(ip);//OK//!t(cip);//NotOKu(ip);//OKu(cip);//AlsoOK//!int*ip2=w();//NotOKconstint*constccip=w();//OKconstint*cip2=w();//OK//!*w()=1;//NotOK}///:~

當(dāng)傳遞一個(gè)或返回一個(gè)地址時(shí)(指針或引用),設(shè)置為const可以阻止客戶程序員修改其值。對參數(shù)傳遞而言,C++建議用const引用傳遞替代值傳遞。

問:有什么好處?

答:兼顧了效率和易用性

傳遞地址比傳遞整個(gè)對象更有效;引用傳遞比指針傳遞形式上更簡單。作業(yè):8.5(上機(jī))8.16(上機(jī))6.5const對象與const成員函數(shù)本節(jié)討論const在類中的應(yīng)用const數(shù)據(jù)成員const成員函數(shù)const對象6.5.1const數(shù)據(jù)成員classFred{

constintsize;public:Fred(intsz);voidprint();};Fred::Fred(intsz):size(sz){}voidFred::print(){cout<<size<<endl;}intmain(){

Freda(1),b(2),c(3);a.print(),b.print(),c.print();}///:~Const數(shù)據(jù)成員構(gòu)造函數(shù)初始化列表:常量數(shù)據(jù)成員必須被初始化每個(gè)對象的const成員經(jīng)初始化后都不能改變。這些const成員相互獨(dú)立,可以有不同的值。6.5.1.1staticconst:靜態(tài)常量類成員const數(shù)據(jù)成員實(shí)際上是一個(gè)運(yùn)行期間常量。問:如何獲得編譯期間整個(gè)類的恒定常量?答:方法一:staticconst(見后續(xù)章節(jié))

方法二:枚舉常量

classA {…

enum{SIZE1=100,SIZE2=200};//枚舉常量

intarray1[SIZE1];

intarray2[SIZE2]; };注意:枚舉常量并不是類成員,也不會占用對象的存儲空間,它們在編譯時(shí)被全部求值。

6.5.2const對象

const對象:對象被初始化后,它的數(shù)據(jù)成員在其生命期內(nèi)不被改變。constinti=1;//constintconstblobb(2);//const對象

b.modify();

6.5.2.1如何保證const對象不被改變?公有數(shù)據(jù):只要用戶不去改變,這些數(shù)據(jù)保持不變是很容易實(shí)現(xiàn)的。問題是:用戶在調(diào)用成員函數(shù)時(shí),也必須保證不改變數(shù)據(jù)。對象如何知道哪些成員函數(shù)將會改變數(shù)據(jù)?對象如何知道哪些成員函數(shù)對于const對象來說是安全的?解決方法:

強(qiáng)制聲明和定義const成員函數(shù),顯式地告訴編譯器這些函數(shù)對數(shù)據(jù)是安全的,可以被const對象調(diào)用。6.5.3const成員函數(shù)在成員函數(shù)的聲明和定義后面加上const使之成為const成員函數(shù)。

classX{

inti;public:

X(intii);

int

const_f()const;

intf();};

X::X(intii):i(ii){}

int

X::const_f()const{returni;}

int

X::f(){…;}const_f()是const函數(shù),保證不修改x2;intmain(){Xx1(10);constXx2(20);x1.f();//OKx2.const_f();//OK}6.5.4const對象與const成員函數(shù)聲明為const的對象是不能被賦值的聲明為const的對象不能隨便調(diào)用任意的成員函數(shù)

x2.f();//error,f()非const成員函數(shù)聲明為const的對象只能調(diào)用聲明為const的成員函數(shù)

x2.conft_f();//OKconst的成員函數(shù)不能改變成員變量例:const成員函數(shù)與非const成員函數(shù)classQuoter{

int

lastquote;public:

Quoter();

int

lastQuote()const;constchar*quote();};Quoter::Quoter(){

lastquote=-1;srand(time(0));//Seedrandomnumbergenerator}int

Quoter::lastQuote()const{returnlastquote;}constchar*Quoter::quote(){staticconstchar*quotes[]={"Arewehavingfunyet?","Doctorsalwaysknowbest","Isit...Atomi

溫馨提示

  • 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論