1. 程式人生 > >C++ this指針和const成員函數

C++ this指針和const成員函數

t對象 style amp 編程風格 讀取 col span using rdquo

this指針

  1. this指針:成員函數通過一個名為this的隱式形參來訪問調用它的那個對象。this由調用該成員函數的對象的地址初始化。
    1 Sales_data total; 
    2 total.isbn(); //等價於Sales_data::isbn(&total),編譯器負責把total的地址傳遞給isbn的隱式形參this
  2. this是一個常量指針,因為this總是指向“這個”對象,不允許改變this中保存的地址。

const成員函數:

  1. 來源:默認情況下,this是指向類類型非常量版本的常量指針,盡管this是隱式形參,但也需要遵循初始化準則,在默認情況下不能把this綁定到一個常量對象上(普通指針不能指向常量),即我們不能在一個常量對象上調用普通的成員函數。因此,設計類的一個準則就是對於不改變數據成員的成員函數都要在後面加 const,而對於改變數據成員的成員函數不能加 const。
    (1)有 const 修飾的成員函數(指 const 放在函數參數表的後面,而不是在函數前面或者參數表內),只能讀取數據成員,不能改變數據成員;沒有 const 修飾的成員函數,對數據成員則是可讀可寫的。
    (2)除此之外,在類的成員函數後面加 const 還有什麽好處呢?那就是常量(即 const)對象可以調用 const 成員函數,而不能調用非const修飾的函數。
  2. 在C++中,只有被聲明為const的成員函數才能被一個const類對象調用。
  3. const成員函數可以訪問非const對象的非const數據成員,const數據成員,也可以訪問const對象內的所有數據成員。
  4. 非const成員函數只可以訪問非const對象的任意的數據成員(不能訪問const對象的任意數據成員)。
  5. 作為一種良好的編程風格,在聲明一個成員函數時,若該成員函數並不對數據成員進行修改操作,應盡可能將該成員函數聲明為const 成員函數。
  6. const成員函數可以被對應的具有相同形參列表的非const函數重載:如果只有const成員函數,非const對象是可以調用const成員函數的。當const版本和非const版本的成員函數同時出現時,非const對象調用非const成員函數。
    #include<iostream>
    using namespace std;
    
    class A
    {
    public:
        void f()
        {
            cout 
    << "not const" << endl; } void f() const { cout << "const" << endl; } }; int main() { A a; cout << "a: "; a.f(); const A &b = a; cout << "b: "; b.f(); const A *c = &a; cout << "c: "; c->f(); A *const d = &a; cout << "d: "; d->f(); A *const e = d; cout << "e: "; e->f(); const A *f = c; cout << "f: "; f->f(); return 0; }

    //output:

    a: not const
    b: const
    c: const
    d: not const
    e: not const
    f: const

     

C++ this指針和const成員函數