我试图编写自己的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