版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- CCAA - 2016年12月環(huán)境管理體系基礎(chǔ)答案及解析 - 詳解版(100題)
- CCAA - 2013服務(wù)標(biāo)準(zhǔn)化與服務(wù)認(rèn)證(機(jī)構(gòu))答案及解析 - 詳解版(29題)
- 養(yǎng)老院緊急情況處理制度
- 企業(yè)員工培訓(xùn)與發(fā)展制度
- 浙江省事業(yè)單位考試職業(yè)能力傾向測驗(yàn)(醫(yī)療衛(wèi)生類E類)應(yīng)考要點(diǎn)詳解
- 我國上市公司治理結(jié)構(gòu)、信息不對稱與自愿性信息披露的聯(lián)動(dòng)效應(yīng)及優(yōu)化路徑研究
- 重金屬回轉(zhuǎn)窯焙燒工操作規(guī)范考核試卷含答案
- 插秧機(jī)操作工安全宣教模擬考核試卷含答案
- 遺體火化師安全強(qiáng)化測試考核試卷含答案
- 乙炔發(fā)生工安全實(shí)操水平考核試卷含答案
- 福建省寧德市2025-2026學(xué)年高三上學(xué)期期末考試語文試題(含答案)
- 建筑施工行業(yè)2026年春節(jié)節(jié)前全員安全教育培訓(xùn)
- 食品生產(chǎn)余料管理制度
- 2026年浦發(fā)銀行社會招聘備考題庫必考題
- 2026屆高考語文復(fù)習(xí):小說人物形象復(fù)習(xí)
- 脫碳塔CO2脫氣塔設(shè)計(jì)計(jì)算
- 產(chǎn)品報(bào)價(jià)單貨物報(bào)價(jià)表(通用版)
- 皰疹性咽峽炎臨床路徑
- 中學(xué)保安工作管理制度
- 內(nèi)蒙古品味自然農(nóng)牧業(yè)公司VI設(shè)計(jì)理念
- 上腔靜脈綜合征的護(hù)理
評論
0/150
提交評論