【发布时间】:2011-02-20 01:37:35
【问题描述】:
我正在尝试编写自己的 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");
printf(a);
我尝试调试它,但有时我迷路了。首先,它为“hello”和“world”调用构造函数 2 次。然后它在 + 运算符中,这很好。然后它调用空字符串的构造函数。之后它进入“CString(CString&str)”,现在我迷路了。为什么会这样?在此之后,我注意到包含“Hello World”的字符串在析构函数中(连续几次)。我又很困惑。再次从 char* 转换为 Cstring 并来回转换后,它停止了。它永远不会进入 = 运算符,但也不会更进一步。永远无法达到 printf(a)。
我为此使用 VisualStudio 2010,但它基本上只是标准的 c++ 代码,因此我认为它不会有太大的不同
【问题讨论】:
-
我理解教育,但“需要”的目的呢?你不喜欢标准的 std::string?
-
坦率地说,没有。我梦想着智能且易于使用的代码。查看 CPlusplus.com 我注意到 std::string 不能做这样的事情: string a = string("Hello") + string(" world") 或 string a = String("Hello")+ " World" 因为它缺少 + 重载。更重要的是,在我的项目的这一部分中,我必须大量使用字符串,因此我更喜欢拥有一个具有我想要的所有功能以及我想要的方式的字符串。我希望我不会因为这样说而受到冷落。
-
真正不能做的是:str3 = "qwe" + "rty";在标准中,operator+ 是字符串的全局函数。对我来说,重新定义 std::string 只是因为你想要它而不是有特定需求是初学者的错误。
-
(你甚至还没有尝试过,看看你想要的东西实际上可以通过标准实现)
标签: c++ string reference overloading operator-keyword