對(duì)于 const Fred * p
來(lái)說(shuō)一喘, p是一個(gè)指針桑滩, 指向了一個(gè) 常量Fred. 假設(shè)Fred 類有一個(gè)叫做 inspect() 的 const 成員函數(shù)沃呢,那么寫 p->inspect() 是可以的徘层。但如果 Fred 類有一個(gè)非 const 成員函數(shù) mutate() ,那么寫 p->mutate() 就是個(gè)錯(cuò)誤(編譯器會(huì)捕獲這種錯(cuò)誤堆缘;不會(huì)在運(yùn)行時(shí)測(cè)試;因此 const 不會(huì)降低運(yùn)行速度)普碎。
也就是說(shuō)const對(duì)象只能調(diào)用const方法吼肥。
同理, const引用也是這樣麻车, 比如const Fred & x
缀皱, x也只能調(diào)用const方法。
那什么是const成員函數(shù)动猬。 就是這個(gè)函數(shù)只能訪問(wèn) 成員屬性啤斗, 不能修改成員屬性。
class Fred {
public:
void inspect() const; // 該成員保證不修改*this
void mutate(); // 該成員可能會(huì)修改*this
};
void userCode(Fred& changeable, const Fred& unchangeable)
{
changeable.inspect(); // 正確:沒(méi)有修改一個(gè)可修改對(duì)象
changeable.mutate(); // 正確:修改一個(gè)可修改對(duì)象
unchangeable.inspect(); // 正確:沒(méi)有修改一個(gè)不可修改對(duì)象赁咙。
unchangeable.mutate(); // 錯(cuò)誤:試圖修改一個(gè)不可修改對(duì)象钮莲。
}
const方法可以有 const對(duì)象 和 非const 對(duì)象調(diào)用, 但是 const對(duì)象只能調(diào)用 const 方法彼水。
const重載崔拥, 同名的const方法和非const方法是重載的, 比如
class Fred { ... };
class MyFredList {
public:
const Fred& operator[] (unsigned index) const; ←下標(biāo)運(yùn)算符通常成對(duì)出現(xiàn)
Fred& operator[] (unsigned index); ←下標(biāo)運(yùn)算符通常成對(duì)出現(xiàn)...
};
同理凤覆, 對(duì)于參數(shù)來(lái)說(shuō)链瓦, const參數(shù)和非const參數(shù)也不是同一個(gè)類型, 比如 const std::string
和 std:string
就不是同一個(gè)類型
const Fred *p有什么含義盯桦, p是一個(gè)指針慈俯, 指向一個(gè) const對(duì)象Fred, p只能調(diào)用 Fred 的 const 成員方法俺附。同理
const Fred* p 表明 p 指向一個(gè) const 的 Fred 對(duì)象—— Fred 對(duì)象不能通過(guò) p 修改肥卡。
Fred* const p 表明 p 是一個(gè)指向 Fred 對(duì)象的 const 指針——可以通過(guò) p 修改 Fred 對(duì)象,但不能修改 p 本身事镣。
cosnt Fred* const p 表明“ p 是一個(gè)指向 const Fred 對(duì)象的 const 指針”——不能修改 p 步鉴,也不能通過(guò) p 修改 Fred 對(duì)象揪胃。
18.6 “ const Fred& x ”是什么意思?
mutable和 const_cast方法
如果 const 方法也想要改變成員屬性氛琢, 這個(gè)屬性必須是 mutable 的喊递, 但是由于不是所有的編譯器都支持mutable 這個(gè)關(guān)鍵字, 所以最好不要使用阳似。
const_cast
const成員函數(shù)骚勘, 就是在參數(shù)列表之后增加一個(gè)const限定, 該成員函數(shù)可以由const對(duì)象和 非const對(duì)象調(diào)用撮奏,該成員函數(shù)確保不會(huì)修改成員屬性俏讹。
const對(duì)象只能調(diào)用const成員函數(shù), 不能調(diào)用非const成員函數(shù)畜吊。