我无法看到下面的代码片段有什么问题,我试图重载运算符“=”。 我可以构建它但不运行它(它崩溃)。它由于main方法中的以下语法:
string2 = "my world!";
据我所知 - 在运算符的左侧是保持运算符重载函数的对象,并在运算符的右侧接收字符串文字(作为参数传递给函数)。
下面是完整的代码:
#include <iostream>
using namespace std;
class String {
public:
char *string;
String(char *ch) {
string = ch;
}
String (String &string_obj) {
string = string_obj.string;
}
String operator=(char *ch) {
strcpy(string, ch);
return *this;
}
};
ostream &operator<<(ostream &stream, String obj) {
stream << obj.string;
return stream;
}
int main() {
String string("hello ");
String string2(string);
cout << string << string2;
string2 = "my world!";
cout << string2;
return 0;
}
答案 0 :(得分:1)
你在这行String string("hello ");
中传递一个常量字面值
当你在strcpy
内进行String operator=(char *ch)
时,它会尝试修改常量内存位置的内容,从而导致问题崩溃。
你可以尝试这样做
int main() {
char str[]="hello";
String string(str);
String string2(string);
cout << string << string2;
string2 = "my world!";
cout << string2;
return 0;
}
答案 1 :(得分:1)
在operator=
您试图将char*
的内容复制到成员变量string
,但它可能是NULL
,它可能没有足够的内存来容纳复制字符串。您的代码中还存在其他问题,例如未将const
引用传递给复制构造函数等。我认为您应该在尝试重载运算符之前先学习基础知识。
答案 2 :(得分:0)
您的代码在很多方面都被破坏了。如果这是出于学习目的,您应该查看std::string
{{1}}。如果您打算在生产代码中使用该类:不要,只需使用at existing implementations。
答案 3 :(得分:0)
首先,你的String类应该具有值语义,而且它没有。其次,您没有为String分配任何内存。