我需要通过重载"="操作符将一个对象分配给另一个对象。我写了代码,但它不工作。问题可能出在哪里?
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;
}
第一个评论:只要你指定了非平凡的析构函数,而且更重要的是--复制赋值,你也需要指定复制构造函数。
接下来,复制操作符应返回对以下内容的引用。*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中被删除)?