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

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    C++ 调试问题:对象包含与成员函数不兼容的类型限定符

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/402843

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年4月21日 上午11:15
下一篇 2023年4月21日 上午11:15

相关推荐