星期五, 6月 04, 2010

Class的const對象與const成員函數

遇到的問題:

程式碼:

IntArray(const IntArray &copy)
{
        array = new int[copy.getSize()];
        for(int i=0;i<copy.getSize();i++)
                array[i] = copy[i];
        size = copy.getSize();
}


輸出:

1>.\test06.cpp(33) : error C2662: 'IntArray::getSize' : 無法將 'this' 指標從 'const IntArray' 轉換成 'IntArray &'
1>        轉換遺失限定詞
1>.\test06.cpp(34) : error C2662: 'IntArray::getSize' : 無法將 'this' 指標從 'const IntArray' 轉換成 'IntArray &'
1>        轉換遺失限定詞
1>.\test06.cpp(35) : error C2678: 二元運算子 '[' : 找不到使用左方運算元型別 'const IntArray' 的運算子 (或是沒有可接受的轉換)
1>        .\test06.cpp(65): 可能是 'int &IntArray::operator [](int)'
1>        當嘗試符合引數清單 '(const IntArray, int)' 時
1>.\test06.cpp(36) : error C2662: 'IntArray::getSize' : 無法將 'this' 指標從'const IntArray' 轉換成 'IntArray &'
1>        轉換遺失限定詞


如果將程式改為

IntArray(IntArray &copy)
{
        array = new int[copy.getSize()];
        for(int i=0;i<copy.getSize();i++)
                array[i] = copy[i];
        size = copy.getSize();
}

或是

IntArray(const IntArray &copy)
{
        array = new int[copy.size];
        for(int i=0;i<copy.size;i++)
                array[i] = copy.array[i];
        size = copy.size;
}

就沒有問題

size, getSize() 皆為 public member
getSize() 只有return size而已
有overload operator[]

想問的是為什麼加了const後就只能用member variable而不能用member function?




推 littleshan:getSize() {...} 要改成 getSize() const {...}          06/03 10:04
→ littleshan:原因...請翻書 (煙                                                 06/03 10:04
推 ilovebbs:const對象只能使用const成員函數~                  06/03 10:43



另外查的資料
擴擴咱 - C++ 學習筆記:長相怪異的 const 成員函數

總之就是…
1. const對象只能使用const成員函數
2. const成員函數範例 void myClass::foobar() const {}
3. 其實「const 成員函式」的道理非常簡單,const加在函式後面的意思就是「限定一個函數只能取得資料,不能改變資料」。物件導向語言裡面會看到getter函式和setter函式概念的設計,他們的功能主要是讓私有變數可以用公有函數來存取 (在AS3.0裡甚至可以像物件屬性