zoukankan      html  css  js  c++  java
  • 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限定的成员函数,即使没有修改对象内部状态;
  • 相关阅读:
    iscroll.js
    HTML 第九章总结
    HTML第八章总结
    HTML第七章总结
    HTML第六章总结
    HTML第五章总结
    HTML第四章总结
    HTML第三章总结
    HTML第二章总结
    HTML第一章总结
  • 原文地址:https://www.cnblogs.com/fortunely/p/15549084.html
Copyright © 2011-2022 走看看