四、對(duì)const修飾符的簡(jiǎn)單說(shuō)明
如果一個(gè)對(duì)象被聲明為常量,那么該對(duì)象就不可以調(diào)用類(lèi)當(dāng)中任何非常量型的成員函數(shù)(除了被編譯器隱式調(diào)用的構(gòu)造函數(shù)和析構(gòu)函數(shù))?聪旅娴拇a;
#include iostream.h
class Date
{
int month,day,year;
public:
Date(int m,d,y):month(m),day(d),year(y) {}
void display()
{
cout< }
}
int main()
{
const Date dt(4,7,2004);
dt.display(); //error
return 0;
}
這個(gè)程序盡管編譯時(shí)沒(méi)有問(wèn)題,但運(yùn)行時(shí)卻出錯(cuò)了。這是因?yàn)槌A繉?duì)象不能調(diào)用非常量函數(shù)。編譯器只看函數(shù)的聲明,而不在乎函數(shù)的具體實(shí)現(xiàn)。實(shí)際上函數(shù)的實(shí)現(xiàn)可以在程序中的任何地方,也可以是在另一個(gè)源代碼文件中,這就超過(guò)了編譯器的當(dāng)前可見(jiàn)范圍。
//date.h
class Date
{
int month,day,year;
public:
Date(int m,d,y);
void display();
};
//date.cpp
#include iostream.h
#include date.h
Date::Date(int m,d,y):month(m),day(d),year(y) {}
void Date::display()
{
cout< }
//program.cpp
#include iostream.h
#include date.cpp
int main()
{
const Date dt(4,7,2004);
dt.display();
return 0;
}
解決出錯(cuò)的問(wèn)題有兩個(gè)方法:第一是聲明display()函數(shù)為常量型的
//in date.h
void display() const
//int date.cpp
void Date::display() const
{
cout< }
另一個(gè)解決方式就是省略掉Date對(duì)象聲明里的const修飾符。
Date dt(4,7,2004);
還有另一個(gè)容易出錯(cuò)的地方:
void abc(const Date& dt)
{
dt.display(); //error 提示display沒(méi)有const修飾符
}
函數(shù)abc()聲明了一個(gè)Date對(duì)象的常量引用,這說(shuō)明該函數(shù)不會(huì)修改傳遞進(jìn)來(lái)的參數(shù)的值。如果Date::display()函數(shù)不是常量型的,那么在函數(shù)abc()里就不能調(diào)用它,因?yàn)榫幾g器會(huì)認(rèn)為Date::display()函數(shù)有可能會(huì)修改常量的值。
不論類(lèi)對(duì)象是否是常量型的,它必須修改某個(gè)數(shù)據(jù)成員的值時(shí),ANSI委員會(huì)設(shè)立了mutable關(guān)鍵字。
五、可變的數(shù)據(jù)成員
假設(shè)需要統(tǒng)計(jì)某個(gè)對(duì)象出現(xiàn)的次數(shù),不管它是否是常量。那么類(lèi)當(dāng)中就應(yīng)該有一個(gè)用來(lái)計(jì)數(shù)的整型數(shù)據(jù)成員。只要用mutable修飾符來(lái)聲明該數(shù)據(jù)成員,一個(gè)常量型的成員函數(shù)就可以修改它的值。
#include iostream.h
class AValue
{
int val;
mutable int rptct;
public:
AValue(int v) : val(v), rptct(0) { }
~AValue()
{
cout< }
void report() const;
};
void AValue::report() const
{
rptct++;
cout << val << endl;
}
int main()
{
const AValue aval(123);
aval.report();
aval.report();
aval.report();
return 0;
}
相關(guān)推薦:2010年9月計(jì)算機(jī)等級(jí)考試試題及答案解析專(zhuān)題北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |