如何编写类对象的挪用功能。

问题描述 投票:0回答:1

我需要通过重载"="操作符将一个对象分配给另一个对象。我写了代码,但它不工作。问题可能出在哪里?

CString operator =(const CString& obj) {
        CString temp;
        temp.c = obj.c;
        temp.length = obj.length;
        return temp;
    }

完整的代码。

#include <iostream>
using namespace std;

class CString {
private: 
    char* c;
    int length;
public:
    CString() {
        length = 0;
        c = new char[1];
        *c = 0;
    }
    CString(const char* s) { 
        length = strlen(s);
        c = new char[length + 1];
        for (int i = 0; i < length; i++) { c[i] = s[i]; }
        c[length] = '\0';
    }
    CString(int leng, char* payload) { 
        length = leng;
        c = payload;
    }
    ~CString() {
        delete[] c;
    }
    CString operator +(const CString& b) {
        int newlength = length + b.length;
        char* newstr = new char[newlength + 1];
        strcpy(newstr, c);
        strcpy(newstr + length, b.c);
        return CString(newlength, newstr);
    }
    void Show(void) { cout << c << endl; }
    CString operator =(const CString& obj) {
        CString temp;
        temp.c = obj.c;
        temp.length = obj.length;
        return temp;
    }
};

int main() {
    CString a("First, ");
    CString b("Second.");
    a = c;


    return 0;
}
c++ operator-overloading
1个回答
1
投票

第一个评论:只要你指定了非平凡的析构函数,而且更重要的是--复制赋值,你也需要指定复制构造函数。

接下来,复制操作符应返回对以下内容的引用。*this:这让你可以采用这样的链式。"a = b = c;

复制分配可能是这样的。

    CString& operator =(const CString& obj) {
        delete[] c;
        length = obj.length;
        c = new char[length + 1];
        for (int i = 0; i <= length; i++) { c[i] = obj.c[i]; }
        return *this;
    }

然而,考虑到我的第一条评论,你可以只实现一次复制。

    CString(const CString& obj) {
        length = obj.length;
        c = new char[length + 1];
        for (int i = 0; i <= length; i++) { c[i] = obj.c[i]; }
    }

    CString& operator =(const CString& obj) {
        CString tmp(obj)
        swap(length, tmp.length);
        swap(c, tmp.c);
        return *this;
    }

另外你的构造函数 CString(int leng, char* payload) 看起来很可疑。你是否知道c-string必须以 new 并将在destructor中被删除)?

© www.soinside.com 2019 - 2024. All rights reserved.