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 2017编译器报错信息:
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; } // 添加了const限定符
	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  // 添加了const限定符
	{
		return str;
	}
...
};
...

总结:

  1. 拷贝构造函数中,只能调用当前类const限定函数;
  2. const限定的成员函数,只能调用const限定的成员函数,而不能调用非const限定的成员函数,即使没有修改对象内部状态;
原文地址:https://www.cnblogs.com/fortunely/p/15549084.html