C++ 复制构造函数和常量

C++ 复制构造函数和常量,c++,constructor,constants,C++,Constructor,Constants,这是我遇到问题的代码 class MyString { char* str; public: MyString(const char* _str) : str(_str) {} } 这是来自编译器的错误消息 错误:从“const char*”到“char*”的转换无效[-fpermissive] 这是因为str是char*而\u str是const char* 副本(我的意思是str(_str))是否应该是完全相同的类型(关于const) 如何将此代码修改为合理的代码?我想保持

这是我遇到问题的代码

class MyString {
    char* str;
public:
    MyString(const char* _str) : str(_str) {}
}
这是来自编译器的错误消息

错误:从“const char*”到“char*”的转换无效[-fpermissive]

这是因为
str
char*
\u str
const char*

副本(我的意思是
str(_str)
)是否应该是完全相同的类型(关于
const


如何将此代码修改为合理的代码?我想保持
MyString(const char*\u str)
const char*

简短回答:是

答案是:
const char*str
是指向内存中包含c字符串的区域的指针。通过将其标记为
const
,表示它可能无法更改。您正试图创建一个指向同一内存区域的新指针,但这个新指针表示该区域可能已更改,编译器对此表示不满(因为原始指针表示这是不允许的)


请注意,您当前并没有将内容复制到字符串(我怀疑您想要),而是复制到字符串的指针。要真正复制字符串,必须首先分配内存,然后复制内容。或者只使用
std::string
,它可以为您管理所有这些。

是的,您不能将
const char*
指针(指向常量的指针)分配给
char*
指针(指向非常量的指针),它们不兼容

如果不介意类按原样指向原始字符数据,则可以将
str
成员设为指向常量的指针:

类MyString{
常量字符*str;
公众:
MyString(const char*_str):str(_str){}
};
您只需确保原始字符数据比
MyString
对象更有效

这可能不是你想要的。另一个选项是让类将字符数据复制到自身中:

类MyString{
char*str=nullptr;
公众:
MyString(常量字符*_str){
如果(_str){
str=新字符[strlen(_str)+1];
strcpy(str,_-str);
}
}
...
};
只需确保按照正确的方法管理该副本即可。这意味着实现析构函数来释放副本,实现复制构造函数和复制赋值运算符来复制数据,实现移动构造函数和移动赋值运算符来移动数据:

类MyString{
char*str=nullptr;
公众:
MyString()=默认值;
MyString(常量字符*_str){
如果(_str){
str=新字符[strlen(_str)+1];
strcpy(str,_-str);
}
}
MyString(constmystring&src):MyString(src.str){}
MyString(MyString&&src){
str=src.str;
src.str=nullptr;
}
~MyString(){
删除[]str;
}
MyString&operator=(MyString rhs){
mystringtmp(std::move(rhs));
标准::交换(src,tmp.src);
归还*这个;
}
};

更好的解决方案是使用
std::string
,它可以为您处理所有这些细节。

这不是复制构造函数!类型必须完全相同,是的。我如何才能将此代码修改为合理的代码?不要将该指针指定给内部保留的类成员。您需要为它分配和管理内存,以保存指针参数指向的内容的副本。我想这就是这个构造函数的目的。int size=3;常量int_size=大小;工作,但不是常量字符*和字符*。。。这与指针有关吗?@mbae059它与c样式的字符串(以零结尾的字符序列)有关,不幸的是,这些字符串不是固有类型。标准C++将这个空隙与<>代码> STD::String 类.@ MbAe059覆盖,因为它复制了一个值;实例化原始整数的副本。对于指针,您没有复制它所指向的值,因此新指针也需要是
const
。这个答案基本上是正确的,但不要陷入认为
const char*
指向C字符串的陷阱。它只是指向
const char
的指针。它几乎总是用作指向C字符串的指针,但有时不是。例如,
charch;常量char*ptr=&ch'
+1.