1. 程式人生 > 其它 >C++ 除錯問題:物件包含與成員函式不相容的型別限定符

C++ 除錯問題:物件包含與成員函式不相容的型別限定符

今天除錯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::sizeString::c_str
我們知道,operator =左側表示式類內部成員是會被修改的,而右側表示式類內部是不會修改的,因此只能呼叫等號右側物件的const限定的函式(不是指const返回值),強制不能修改物件內部狀態。
解決辦法:在String::sizeString::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;
	}
...
};
...

總結:

  1. 拷貝建構函式中,只能呼叫當前類const限定函式;
  2. const限定的成員函式,只能呼叫const限定的成員函式,而不能呼叫非const限定的成員函式,即使沒有修改物件內部狀態;