繁体   English   中英

字符串类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 ("%s\n", s.c_str ());
}

您应该复制作为参数传递的以空终止的字符串的内容。

一件事是您可能会删除终止null,因为如果您拥有自己的类,则可以通过保持当前长度来手动管理字符串边界。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM