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::size
和String::c_str
。
我们知道,operator =
左侧表达式类内部成员是会被修改的,而右侧表达式类内部是不会修改的,因此只能调用等号右侧对象的const限定的函数(不是指const返回值),强制不能修改对象内部状态。
解决办法:在String::size
和String::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;
}
...
};
...
总结:
- 拷贝构造函数中,只能调用当前类const限定函数;
- const限定的成员函数,只能调用const限定的成员函数,而不能调用非const限定的成员函数,即使没有修改对象内部状态;