c++的字符串类
String Class C++
假设我想编写自己的字符串类。字符串有一个属性char * s
,它是一个指向字符的指针。
现在在构造函数String::String()
中,你将传递什么来假设另一个char *
?你不能像下面的代码那样做,因为两个指针将指向相同的东西(我们不希望那样):
String::String(const char *str) {
s = str;
}
任何帮助都是感激的!
您需要深度复制字符串,即创建一个足够长的字符缓冲区来合并str
的内容,然后将内容复制到其中。最简单的方法是使用 strdup
strcpy
,因为前者是不标准的:
s = new char[strlen (str) + 1];
if (s == NULL) throw some_exception;
strcpy (s, str);
请不要编写自己的字符串类。有很多细节你必须知道,以避免引入错误(例如,重载操作符,布尔习惯用法等),以及更多的细节,使字符串类高效(例如,实现写时复制)等。但出于教学目的,您必须复制传递的字符串。下面是一个例子:
#include <cstdint>
#include <cstring>
#include <cstdio>
class String
{
char *p_;
public:
explicit String (const char *str)
{
auto length = std::strlen (str) + 1;
p_ = new char [length];
std::memcpy (p_, str, length);
}
~String ()
{
delete [] p_;
p_ = nullptr;
}
inline const char *c_str () const
{
return p_;
}
};
int
main ()
{
String s ("Hello, world!");
std::printf ("%sn", s.c_str ());
}
您应该复制作为参数传递的以空结尾的字符串的内容。
有一件事是你可能会删除终止null,因为如果你有自己的类,你可以通过保持当前长度来手动管理字符串边界。