不能将Const数据类型分配到非Const数据类中

Const data type cannot be assigned into a non-const data type

本文关键字:Const 数据 分配 数据类型 不能      更新时间:2023-10-16

我正试图用复制构造函数创建一个非常简单的字符串类,我遇到的问题是,我试图将数据类型/对象作为常量发送,但每当我试图将其分配给相同的非常量数据时,编译器都会抱怨。

我不明白为什么编译器会抱怨,我只是试图复制数据,我没有修改它。

标题

class MyString{
private:
    char* thestring;
    MyString* ms;
public:
    MyString();
    MyString(const char* str);
    MyString(const MyString& str);
    ~MyString();
    MyString& operator=(const char* str);
};

CPP-

MyString::MyString(){
    thestring = '';
}
MyString::MyString(const MyString& str){
    ms = str;
}
MyString& MyString::operator=(const char* str){
    MyString* temp = new MyString();
    temp->thestring = str; 
    return temp;
}
MyString::MyString(const char* str){
}
MyString::~MyString(){
}

以下是错误:

没有合适的从"const MyString"到"MyString*"的转换函数存在9

类型为"const char*"的值不能分配给类型为的实体"char*"14

类型为"MyString&"(非常量限定)的引用不能用类型为"MyString*"的值初始化15

"MyString::operator=':必须返回值16

首先,类中不需要ms成员:它没有任何用途,只在(不正确的)复制构造函数中使用。删除ms,并按如下方式重写代码:

MyString::MyString(const MyString& str) {
    thestring = strdup(str.thestring);
}

注意,现在你的代码违反了三条规则:一旦你添加了一个复制构造函数,你还需要一个匹配的赋值运算符和一个析构函数:

MyString& MyString::operator=(const MyString& str) {
    if (this != &str) {
        free(thestring);
        thestring = strdup(str.thestring);
    }
    return *this;
}
MyString::~MyString() {
    free(thestring);
}

最后,我将重写您的默认构造函数,如下所示:

MyString::MyString()
:   thestring(0) {
}

本质上,这并没有什么不同,但初始化列表更规范。

第9行:msMyString*,但str只是const MyString&(即,不是指针)。

第14行:您不能将const char*值分配给char*,因为这可能会允许您更改它:

void foo(const char* dont_change_this) {
  char* s = dont_change_this;
  s[0] = '!';  // you changed it!
}

第15行:再一次,一个简单的指针不匹配。op=的返回类型为MyString&,但temp具有MyString*类型。

但是您不仅仅试图复制数据,您还试图去除它的常量。换句话说,您正试图用常量指针分配一个非常量指针。这将使您能够潜在地更改您想要的"const"的值。