Const数据类型不能分配到非const数据类型

时间:2013-11-29 02:45:55

标签: c++ const

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

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

标题

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 = '\0';
}

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&”类型的引用(不是const限定的)不可能   使用“MyString *”15

类型的值初始化      

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

3 个答案:

答案 0 :(得分:2)

首先,您的班级中不需要ms成员:它没有用处,只在您的(不正确的)复制构造函数中使用。删除ms,并按如下所示重写代码:

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

请注意,现在您的代码违反了rule of three:添加复制构造函数后,您还需要匹配的赋值运算符和析构函数:

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) {
}

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

答案 1 :(得分:1)

第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*

答案 2 :(得分:0)

但是你不只是试图复制数据,而是试图剥夺它的常量。换句话说,您正在尝试使用const指针分配非const指针。这将使您能够潜在地更改您想要“const”的值。