[英]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 ("%s\n", s.c_str ());
}
您应该复制作为参数传递的以空终止的字符串的内容。
一件事是您可能会删除终止null,因为如果您拥有自己的类,则可以通过保持当前长度来手动管理字符串边界。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.