c++的字符串类

String Class C++

本文关键字:字符串 c++      更新时间:2023-10-16

假设我想编写自己的字符串类。字符串有一个属性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,因为如果你有自己的类,你可以通过保持当前长度来手动管理字符串边界。