C++ 除錯問題:物件包含與成員函式不相容的型別限定符
阿新 • • 發佈:2021-11-13
今天除錯C++自定義String程式碼的時候,碰到一個問題,編譯期報錯:物件包含與成員函式不相容的型別限定符。
先看程式碼:
class String { // 自定義String類 public: String(const char *s) {// 建構函式 if (!s) { len = 0; str = new char[1]; str[0] = 0; } else { len = strlen(s); str = new char[len + 1]; strcpy(str, s); } } ~String() { delete[] str; len = 0; } // 解構函式 int size() { return len; } // 字元個數 String& operator = (const String &s) { // 拷貝建構函式 if (this == &s) return *this; delete[] str; len = s.size(); str = new char[len + 1]; strcpy(str, s.c_str()); return *this; } const char *c_str() { // 獲得c風格字串 return str; } private: char *str; int len; }; int main() { String noun("book"); String verb = noun; cout << noun.c_str() << endl; cout << verb.c_str() << endl; return 0; }
MSVC編譯器報錯資訊:
E1086 物件含有與成員 函式 "String::size" 不相容的型別限定符
E1086 物件含有與成員 函式 "String::c_str" 不相容的型別限定符
問題出在哪裡?
問題似乎出在operator =
中呼叫了String::size
和String::c_str
。
我們知道,operator =
左側表示式類內部成員是會被修改的,而右側表示式類內部是不會修改的,因此只能呼叫等號右側物件的const限定的函式(不是指const返回值),強制不能修改物件內部狀態。
解決辦法:在String::size
和String::c_str
函式上,加上const限定符:
class String { public: int size() const { return len; } String& operator = (const String &s) { if (this == &s) return *this; delete[] str; len = s.size(); str = new char[len + 1]; strcpy(str, s.c_str()); return *this; } const char *c_str() const { return str; } ... }; ...
總結:
- 拷貝建構函式中,只能呼叫當前類const限定函式;
- const限定的成員函式,只能呼叫const限定的成員函式,而不能呼叫非const限定的成員函式,即使沒有修改物件內部狀態;