我試圖編寫自己的C++字符串類爲教育和需要的目的。
首先,我不太瞭解操作員,這就是爲什麼我想學習它們的原因。 我開始寫我的課,但是當我運行它時,它會阻止程序,但不會造成任何崩潰。
看看下面的代碼,請繼續閱讀之前:自定義字符串類(C++)
class CString
{
private:
char* cstr;
public:
CString();
CString(char* str);
CString(CString& str);
~CString();
operator char*();
operator const char*();
CString operator+(const CString& q)const;
CString operator=(const CString& q);
};
首先,我不敢肯定我聲明的一切權利。我試着googleing它,但所有關於重載的教程解釋了非常簡單的基本ideea,但沒有解釋如何以及何時調用每個東西。例如在my =運算符中,程序調用CString(CString & str);但我沒有理由爲什麼。
我還附下面cpp文件:
CString::CString()
{
cstr=0;
}
CString::CString(char *str)
{
cstr=new char[strlen(str)];
strcpy(cstr,str);
}
CString::CString(CString& q)
{
if(this==&q)
return;
cstr = new char[strlen(q.cstr)+1];
strcpy(cstr,q.cstr);
}
CString::~CString()
{
if(cstr)
delete[] cstr;
}
CString::operator char*()
{
return cstr;
}
CString::operator const char*()
{
return cstr;
}
CString CString::operator +(const CString &q) const
{
CString s;
s.cstr = new char[strlen(cstr)+strlen(q.cstr)+1];
strcpy(s.cstr,cstr);
strcat(s.cstr,q.cstr);
return s;
}
CString CString::operator =(const CString &q)
{
if(this!=&q)
{
if(cstr)
delete[] cstr;
cstr = new char[strlen(q.cstr)+1];
strcpy(cstr,q.cstr);
}
return *this;
}
爲了測試我以前一樣簡單的碼本
CString的一個= CString的( 「你好」)+ CString的( 「世界」);
printf(a);
我試着調試它,但是在一個點我迷路了。首先爲「hello」和「world」調用構造函數2次。然後,它在+運營商這是很好的。然後它調用空字符串的構造函數。之後,它進入「CString(CString & str)」,現在我迷路了。這是爲什麼發生?在此之後,我注意到包含「Hello World」的字符串在析構函數中(連續幾次)。我再次感到非常困惑。在從char *再次轉換爲Cstring並來回之後,它停止。它永遠不會進入=運算符,但它也不會進一步發展。 printf(a)永遠不會到達。
我使用VisualStudio的2010年這一點,但它基本上只是標準的C++代碼,因此我不認爲它應該使多大的差別在於
我理解的教育,但對於「需要」的目的?你不喜歡標準的std :: string? – Nikko 2010-05-16 11:57:41
坦率地說,沒有。我夢想這個智能且易於使用的代碼。我發現std :: string不能做這樣的事情:string a = string(「Hello」)+ string(「world」)or string a = String(「Hello」)+「World」因爲它缺少+過載。 更多的是,我必須在我的項目的這一部分中使用字符串進行很多工作,因此要求具有我想要的所有功能以及我想要的功能。 我希望我不會因爲這樣說而受到傷害。 – Sanctus2099 2010-05-16 12:05:14
你真的不能做的是:str3 =「qwe」+「rty」; 在標準中,operator +是字符串的全局函數。 對我來說,重新定義一個std :: string是一個初學者的錯誤,只是因爲你需要它而不是有特定的需求。 – Nikko 2010-05-16 12:41:36