為什麼非指針對象不能使用const成員函數?
01-28
注釋加上就報錯我的猜想是v是成員,所以函數的返回值可能導致對象的成員改變,而pv是指針,所以pv指向的地址不會變,所以可以加上const,不知道對不對。還有,const函數只能調用const函數,那麼說明front底層也是const的,那為什麼可以直接調用vector中的front函數作為左值進行賦值?
既然可以,那為什麼上圖加上注釋內容會報錯?目前學到c++ primer12章。。。
const成員函數把this指針限定為指向常量的常量指針了,通過一個指向常量的指針去修改其指向的對象,當然無法修改。
想想,你能修改const char *指向的字元串或者內存里的內容么?
vector front 原型如下
reference front();
const_reference front() const;
string f() 更為 const string f() 就可以編譯過了。
系統的解釋下。
- 類成員函數聲明後面加上 const 是什麼意思?
- 舉個例子, class Foo 一個成員函數是 void test() 將會以 test(Foo* this) 進行編譯,所以可以在函數內部使用 this 指針。而另外一個成員函數 void test() const 將會以 test(const Foo* this) 進行編譯。
- 對於引用(指針)類型,const 限定可以對函數進行重載。
- 非 const 對象優先調用非 const 成員函數,const 對象只能調用 const 成員函數。因為 const 函數限定使用 const this.
- const 限定代表什麼?
- 一個被 const 限定的指針 (const type *pointer),其指向內容為 const,即不能修改。
- const 對象非引用對象成員本身作為對象內存的一部分,他們的非 const 成員函數可能修改其本身,所以 const 成員函數禁止非引用成員對象調用 非 const 成員函數。
所以
- 題目中的 v.front() 就是 this-&>v.front(),如果 this 是 const,將會調用 const_reference front() const。v 是 this 指向內存的一部分,它是非引用類型,它的所有非 const 函數可能修改 v 的內存結構。那麼這種情況下,按照簽名返回的是 const string,編譯失敗。
- 但是如果 const 限定指針指向的內存 ,其中存在另外的指針(比如 indirect_pointer),按照前面一條,這個指針(indirect_pointer)指向的內容能否修改只取決於 indirect_pointer 是否有 const。沒有即可以修改,如題目中描述的 pv-&>front() 將調用 reference front(),返回 string, 編譯成功。
const聲明在這個位置,指定了成員函數內的v、pt都是const的。
這時,const的vector是不能插入的。
同時,const vector的front也是返回const引用,當然不能轉為非const的。front函數有const返回值的,也有非const返回值的兩個版本。const pt只是表示這個指針是const,不能修改指向其他對象。pt指向的vector還是非const的,還是可以正常讀寫用。這種情況在動態語言里真是太常見了。
推薦閱讀:
※迭代器尾後元素的設計是出於什麼意圖?
※關於C++中的override?
※C++中有哪些設計精良的部分(精華),還有哪些是不值得花費很多時間探究的知識點?
※C++類對象內存大小的計算?