面向对象程序中的常量
一、常數(shù)據(jù)成員?
????使用constkeyword進(jìn)行說明的數(shù)據(jù)成員,稱為常數(shù)據(jù)成員。其作用和使用方法與一般常變量(const變量)相似,但常數(shù)據(jù)成員的值是不能改變的。
注意:僅僅能通過構(gòu)造函數(shù)的參數(shù)初始化表對常數(shù)據(jù)成員進(jìn)行初始化,不能採用在構(gòu)造函數(shù)中對常數(shù)據(jù)成員賦初值的方法。
比如:
????如在類體中定義了常數(shù)據(jù)成員age:
?????????const?int?age;????//聲明age為常數(shù)據(jù)成員
????在類外定義構(gòu)造函數(shù),應(yīng)寫成下面形式:?
??????????CStudent∷Cstudent(int?a):age?(a){……}//通過參數(shù)初始化表對常數(shù)據(jù)成員age初始化。
??????????CStudent∷Cstudent(int?a){age=a;}?????//錯(cuò)誤,不能在函數(shù)體中初始化常數(shù)據(jù)成員。
注:為了與長對象進(jìn)行差別,特別強(qiáng)調(diào)常數(shù)據(jù)成員能夠被非const和const類型函數(shù)僅僅讀。
二、常對象
1、定義
常對象:對象的全部成員在程序中不能被改動(dòng),數(shù)據(jù)初始化后即為僅僅讀模式。???
?
2、定義常對象的一般形式為
??????類名?const?對象名[(實(shí)參列表)];???
??????const?類名?對象名[(實(shí)參列表)];??
比如:一個(gè)日期對象始終表示2000年5月1號(hào),能夠定義為:
??????Cdate?const?d1(2000,5,1);????????//d1是常對象
3、注意
以Cdate類為例,該類的定義例如以下:
<pre name="code" class="cpp">#include "stdafx.h" #include <iostream> #include <string> #include <stdio.h> using namespace std;//日期類聲明 class Cdate { public:Cdate(int y=1985, int m=1,int d=1) //日期類的構(gòu)造函數(shù){ year=y;month=m;day=d;cout<<"調(diào)用日期類的構(gòu)造函數(shù)"<<endl;}Cdate(Cdate &s) //日期類的拷貝構(gòu)造函數(shù){ year=s.year;month=s.month;day=s.day;cout<<"調(diào)獺用日期類的拷貝構(gòu)造函數(shù)"<<endl;}~ Cdate(){ cout<<"調(diào)用日期類的析構(gòu)函數(shù)"<<endl;}void Print(){cout<<"調(diào)用Print()函數(shù):"<<endl;cout<<year<<"年"<<month<<"月"<<day<<"日"<<endl;} private:int year,month ,day; //定義3個(gè)整型變量,分別表括示日期的年月日 };int _tmain(int argc, _TCHAR* argv[]) {Cdate d1(2001,5,1); d1.Print();system("pause");return 0; }1)常對象在定義時(shí)必需要有初值,通過帶參數(shù)的構(gòu)造函數(shù)或構(gòu)造函數(shù)的參數(shù)初始化表進(jìn)行初始化。
????Cdate?d1(2000,5,1);??????????//一般對象
????Cdate?const?d2?;?????????????//?d2是常對象
?d2=d1;???????????//錯(cuò)誤,常對象必須在定義的時(shí)候賦初值
2)常對象僅僅能以僅僅讀的方式訪問常成員函數(shù),而不能訪問很成員函數(shù)。
假設(shè)希望成員函數(shù)可引用常對象中的數(shù)據(jù)成員,僅僅需將該成員函數(shù)聲明為const就可以。
聲明格式:返回值類型?函數(shù)名()?const?
注意const修飾符的位置在最后面,且構(gòu)造析構(gòu)函數(shù)不用const修飾!
???比如:
? const?Cdate?d1(2000,5,1);??????????//一般對象
d1.Print();
則會(huì)報(bào)出例如以下錯(cuò)誤:error?C2662:?“°Cdate::Print”:?不能將“this”指針從“const?Cdate”轉(zhuǎn)換為“Cdate?&”;
????改為:void?print()?const;???????//將函數(shù)聲明為const,即常成員函數(shù)。
常成員函數(shù)能夠訪問常對象中的數(shù)據(jù)成員,但仍然不同意改動(dòng)常對象中數(shù)據(jù)成員的值。
三、常成員函數(shù)
使用constkeyword進(jìn)行說明的成員函數(shù),稱為常成員函數(shù)。常成員函數(shù)僅僅能讀取本類中的數(shù)據(jù)成員(非const數(shù)據(jù)成員和const數(shù)據(jù)成員),而不能改動(dòng)它們的值。非const成員函數(shù)能夠引用?const數(shù)據(jù)成員。
常成員函數(shù)說明格式例如以下:
類型標(biāo)識(shí)符??函數(shù)名??(?參數(shù)表?)?const;
常量的應(yīng)用:
1)?假設(shè)在一個(gè)類中,有些數(shù)據(jù)成員的值同意改變,還有一些數(shù)據(jù)成員的值不同意改變,則能夠?qū)⒁徊糠謹(jǐn)?shù)據(jù)成員聲明為const,以保證其值不被改變,能夠用非const的成員函數(shù)引用這些數(shù)據(jù)成員的值,并改動(dòng)非const數(shù)據(jù)成員的值。
2)?假設(shè)要求全部的數(shù)據(jù)成員的值都不同意改變,則能夠?qū)⑷康臄?shù)據(jù)成員聲明為const,或?qū)ο舐暶鳛閏onst(常對象),然后用const成員函數(shù)引用數(shù)據(jù)成員,這樣起到“雙保險(xiǎn)”的作用,切實(shí)保證了數(shù)據(jù)成員不被改動(dòng)。
3)?假設(shè)已定義了一個(gè)常對象,僅僅能調(diào)用當(dāng)中的const成員函數(shù),而不能調(diào)用非const成員函數(shù)(不論這些函數(shù)是否會(huì)改動(dòng)對象中的數(shù)據(jù))。這是為了保證數(shù)據(jù)的安全。假設(shè)須要訪問對象中的數(shù)據(jù)成員,可將常對象中全部成員函數(shù)都聲明為const成員函數(shù),但應(yīng)確保在函數(shù)中不改動(dòng)對象中的數(shù)據(jù)成員。
轉(zhuǎn)載于:https://www.cnblogs.com/gcczhongduan/p/4307941.html
總結(jié)
以上是生活随笔為你收集整理的面向对象程序中的常量的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【POJ】【2975】Nim
- 下一篇: Mysql分组合并函数并进行数据列处理