我正在尝试编写自己的 C++ String 类用于教育和需要目的。
首先是我对操作符了解不多,这就是我想学习它们的原因。我开始编写我的课程,但是当我运行它时,它会阻止程序但不会导致任何崩溃。
在进一步阅读之前,请查看以下代码:
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);
};
首先,我不太确定我是否宣布一切正确。我试着用谷歌搜索它,但所有关于重载的教程都解释了基本的想法,这很简单,但缺乏解释每件事是如何以及何时被调用的。例如,在我的 = 运算符中,程序调用 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 a = CString("Hello") + CString(" World");
打印(一);
我尝试调试它,但有时我迷路了。首先,它为“hello”和“world”调用构造函数 2 次。然后它在 + 运算符中,这很好。然后它调用空字符串的构造函数。之后它进入“CString(CString&str)”,现在我迷路了。为什么会这样?在此之后,我注意到包含“Hello World”的字符串在析构函数中(连续几次)。我又很困惑。再次从 char* 转换为 Cstring 并来回转换后,它停止了。它永远不会进入 = 运算符,但也不会更进一步。printf(a) 永远不会到达。
我为此使用 VisualStudio 2010,但它基本上只是标准的 c++ 代码,因此我认为它不会有太大的不同