运算符重载 - 创建新的String类

时间:2014-05-03 15:11:42

标签: c++ string operator-overloading

我现在快要放弃了 - 头痛和红眼睛。你们中的一些人可能会对这个问题进行投票,但我别无选择。我不是懒惰但没有人可以交谈。

所有关于在c ++中创建自己的String-class,其中一个可以连接字符串,将另一个字符串对象发送到字符串构造函数,或者将字符串文字发送到构造函数。

该程序应该输出以下内容:

 hello hello2 
 much hedache!!!
 Enter a name: 
 hello John

相反,该计划正在产生以下内容:

 hello hello2 
 much hedache!!!
 Enter a name: 
 much headache John

对于某些原因,字符串“很头疼”保留在对象中 - 不能用字符串和字符串3的串联替换。

string2 = "much hedache!!!";

我注意到,当我将一个字符串对象发送给构造函数时,这会以某种方式引起。

 String string2(string);

如果我现在将其更改为以下内容:

String string2("hello2");

它有效。

我无法弄清楚为什么,非常高兴有人可以回答这个问题。

#include <iostream>
using namespace std;

class String {

public:
char *string;
String(char *ch) {
    string = new char[strlen(ch)];

    int i = 0;
    for(char *temp_ch_ptr = ch; *temp_ch_ptr; ++temp_ch_ptr) {
        string[i] = *temp_ch_ptr;
        i++;
    }

}
String() {
    string = new char[100];
}

String (String &string_obj) {

    string = new char[strlen(string_obj.string)];

    string = string_obj.string;
}

String operator=(char *ch) {

    strcpy(string, ch);

    return *this;
}

String operator+(String obj) {

    String temp;
    strcpy(temp.string, string);
    strcat(temp.string, obj.string);

    return temp;
}

};

ostream &operator<<(ostream &stream, String obj) {

    stream << obj.string;

    return stream;
}

istream &operator>>(istream &stream, String obj) {

cout << "Enter a name: ";
stream >> obj.string;

return stream;
}



int main() {

  String string("hello ");
  //String string2("hello2 ");
  String string2(string);
  cout << string << string2 << endl;

  string2 = "much hedache!!!";

  cout << string2 << endl;

  String string3;

  cin >> string3;
  string2 = string + string3;
  cout << string2 << endl;

return 0;
}

我不确定复制构造函数 - 可能存在问题吗?

2 个答案:

答案 0 :(得分:2)

  

我不确定复制构造函数 - 可能存在问题吗?

是的,绝对的。它根本不起作用。

string = new char[strlen(string_obj.string)];

在这里,您可以创建一个与现有字符串长度相同的新数组。

string = string_obj.string;

在这里你完全扔掉那个新数组(让它悬空作为内存泄漏),然后将新的字符串对象的指针设置为与旧字符串对象的指针相同。

您需要执行深层复制;我建议std::copy

此复制构造函数也应该const String&,而不是String&;同样,如果您希望传递字符串文字有效,则char*构造函数应该实际使用const char*

答案 1 :(得分:1)

您的程序既有错误又有内存泄漏。在复制构造函数中,您分配内存但是新用,而只是指向传递的字符串的内存。您应该将传递的字符串的内容复制到新分配的内存中。结果,分配的内存丢失。你也没有提供任何析构函数来解除分配内存。

String (String &string_obj) {

  string = new char[strlen(string_obj.string)];

  strcpy(string,string_obj.string);
}

~String(){delete string;}