课堂上的价值在变化?

时间:2017-03-15 10:01:29

标签: c++

我用“abc”分配一个,用“def”分配b,将它们加在一起并进行更改。我想要留下来作为abc。而是它的“abcdef”。 C是应该是“abcdef”的唯一值。我在这里做错了什么?

    #include <iostream>
    #include <conio.h>
    #include <string>

    using namespace std;

    class String {
    public:
        void print();
        String operator=(const String& Other)
        {       
            message = Other.message;
            return *this;
        }
        String operator+(const String& Other)const
        {
            return String(strcat(message, Other.message));
        }
        String operator+=(const String& Other)
        {

        }
        String(char* def = "Default")
        {
            message = new char[strlen(def) + 1];
            strcpy(message, doub);
        }
        String(const String &obj)
        {
            message = obj.message;
        }
        ~String();
    private:
        char * message;
    };
    void String::print()
    {
        cout << message;
    }
    String::~String(void) {

        cout << "Object is being deleted" << endl;
    }


    // Main function for the program
    int main() {
        String a("abc");
        String b("def");
        String c;
        c = a + b;
        _getch();
        return 0;
    }

3 个答案:

答案 0 :(得分:1)

您正在使用strcat,它基本上会将Other.message附加到您的message内存块。您可以在here

中了解相关信息

要解决您的问题,您可以制作以下内容:

return String(strcat(strcat(str.message, this->message), Other.message))

online verification

答案 1 :(得分:1)

“abc”和“def”是C字符串只读文字,它们以只读部分存储在可执行文件中,稍后映射到只读存储器。

当您使用strcat时,您正在调用未定义的行为,因为您正在尝试修改“abc”值。

这里正确的方法是在构造函数中分配内存,并将参数的strcpy值分配给内部分配的指针。然后 - 在operator +中你将重新分配这样的指针以允许更多的内存。

答案 2 :(得分:0)

您有类多个问题,其中大部分问题源于您使用指针message

有一件事是,例如,operator+函数使用指针调用strcat,而不重新分配它指向的内存,因此它将适合旧的 new字符串。

你真的无法重新分配指针,因为你并不真正拥有指针所指向的数据。突出示例:您赋值运算符复制指针而不是它指向的字符串。这意味着你将有两个String个对象都指向同一个内存。

您也没有析构函数,因此您创建的每个String对象都会导致内存泄漏。但是,只是添加一个删除内存的析构函数是不够的,除非你修复指针复制。