不能将Const数据类型分配到非Const数据类中
Const data type cannot be assigned into a non-const data type
我正试图用复制构造函数创建一个非常简单的字符串类,我遇到的问题是,我试图将数据类型/对象作为常量发送,但每当我试图将其分配给相同的非常量数据时,编译器都会抱怨。
我不明白为什么编译器会抱怨,我只是试图复制数据,我没有修改它。
标题
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行:ms
是MyString*
,但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"的值。
相关文章:
- 如何定义在编译时数据未知的 const 数组
- 静态数据成员:它"const declaration / constexpr definition"起作用?
- 静态const数据成员在另一个文件中定义
- 无法将 const 数据类型传递到非 const 函数中
- 将const数据传递到无需const_cast的非const的功能
- 返回指向 const 数据成员和 'auto' 关键字的 const 指针。有点困惑
- 不能将Const数据类型分配到非Const数据类中
- 为什么我不能使用 const 更改 const 数据的值(在我的例子中为 int) const_cast
- 用于具有const数据成员的类的move和右值赋值操作符
- 如何用const数据构造自定义const_iterator
- 具有const数据成员作为类成员的对象
- 初始化类的静态非const数据成员
- 如何在c++ VS2015控制台应用程序中嵌入配置文件,而不是硬编码为const数据
- 为什么没有为包含const数据成员的类提供默认构造函数
- const数据成员
- 指向Const数据和c++列表的Const指针
- 什么名称查找规则适用于静态 const 数据成员定义中的名称
- 非静态const数据成员
- 放置"new"是否可以用于更改"const"数据?
- 为const数据创建cv::Mat标头