2009年2月8日

const的意義與使用時機

const在C++中是很常使用的修飾字,其原本的意義是指「不會被修改」也就是read only的意思。但是隨著其放在不同的地方,而有不同的功能。其中const pointer最容易被搞混,要特別注意。

  1. const value

    const int value = 100;

    value這個變數是read only,在程式當中不可以被修改。
    許多書上建議使用這個方法加上inline來取代macro。

  2. const member value

    class A{
        const int value;
        …
    };

    const member value只在object的生存期間是常數,而對於整個class而言是可變的,因為class可以創建多個instance,不同的instance其const member value可以為不同值。所以不能在class declaration初使化consta member value,因為在instance尚未被建立時,compiler不知道const member value之值。



    要初使用const int value,必須使用constructor:

    A(int val=0):value(val){}



    想要建立在所有instance都相同的常數,可使用enum或者static const來實作:
    class A{
        enum{size = 100};
        const int value = 200;
        int array[size];
        int array2[value];
    };

  3. const pointer

    int value = 500;
    /*
      a, b兩種語法是相同的,因為const都在「*」的左邊,
       代表pointer所指向的值是常數,但是pointer可以指向其它不同的值,
        Ex: a=&another;
    */

    const int *a = &value;         
    int const *b = &value;
    /*
        const在「*」的右邊,代表pointer本身是常數,
       即pointer不可指向其它不同的  值,但是值本身是可變的。
       Ex:value = 300;
    */

    int* const c = &value;
    /*
       pointer所指向的值是常數,且pointer本身也是常數,兩者皆是read only
    */

    const int* const d= &value;

    this pointer本身不可指向其它不同的object,但是其指向的object之值是可以改變的。

  4. const member function

    class A{
        …
        void print() const{}
    };

    const member function是C++特有的語法,是指此member function不會改變任何member data,若是在 function中改變了member data,compile時會傳回error。
  5. const references

    void function(const &value){...}

    使用const reference可以避免在傳遞argument使用call by value的方式,在傳遞物件時比較有效率且可以保證所傳遞的值在function中不會被修改。

  6. argument passing

    const int value = 10;
    void print(int val){}
    print(value);

    可將const variable傳入non-const argument,會自動轉型。同理non-const variable傳入const argument也會自動轉型。 

  7. const_iterator, const_reverse_iterator

    vector<int> vec;
    vector<int>::const_iterator iter;
    vector<int>::const_reverse_iterator riter;

    當STL container的資料為read only時,應使用const iterator以避免修改到資料。