class的对象占用函数怎么写

How to write the function of appropriating of objects of class

我需要通过重载“=”运算符将一个对象分配给另一个对象。写了代码,还是不行。可能是什么问题?

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] = '[=12=]';
    }
    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;
}

第一条评论:只要你指定了非平凡的析构函数,更重要的是——复制赋值,你还需要指定复制构造函数。

接下来,复制操作符应 return 对 *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) 看起来很可疑。您是否意识到必须使用 new 分配 c 字符串(并将在析构函数中删除)?