字符串的运算符重载

时间:2014-05-03 10:42:12

标签: c++ string operator-overloading

我无法看到下面的代码片段有什么问题,我试图重载运算符“=”。 我可以构建它但不运行它(它崩溃)。它由于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;
}

4 个答案:

答案 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分配任何内存。