為什麼非指針對象不能使用const成員函數?

注釋加上就報錯

我的猜想是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++類對象內存大小的計算?

TAG:C | CC | CPrimer | C11 | C編程 |