Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 字符串类C++;_C++_String - Fatal编程技术网

C++ 字符串类C++;

C++ 字符串类C++;,c++,string,C++,String,假设我想编写自己的字符串类。字符串有一个属性char*s,它是指向字符的指针 现在在构造函数中,String::String(),您将传递什么来假定另一个char*?您不能真正执行下面的代码,因为两个指针都指向同一个对象(我们不希望这样): 感谢您的帮助 您应该复制作为参数传递的以null结尾的字符串的内容 一件事是,您可以删除终止null,因为如果您有自己的类,您可以通过保持当前长度手动管理字符串边界。您应该复制作为参数传递的以null终止的字符串的内容 一件事是,您可能会删除终止null,因

假设我想编写自己的字符串类。字符串有一个属性
char*s
,它是指向字符的指针

现在在构造函数中,
String::String()
,您将传递什么来假定另一个
char*
?您不能真正执行下面的代码,因为两个指针都指向同一个对象(我们不希望这样):


感谢您的帮助

您应该复制作为参数传递的以null结尾的字符串的内容


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

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

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

您需要深度复制字符串,即创建一个足够长的字符缓冲区来合并
str
的内容,然后将内容复制到其中。实现这一点的最简单方法是使用strdup
strcpy
,因为前者是非标准的:

s = new char[strlen (str) + 1];
if (s == NULL) throw some_exception;
strcpy (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 ());
}
#包括
#包括
#包括
类字符串
{
char*p_;
公众:
显式字符串(常量字符*str)
{
自动长度=std::strlen(str)+1;
p_=新字符[长度];
std::memcpy(p_,str,长度);
}
~String()
{
删除[]p;
p_u=nullptr;
}
内联常量char*c_str()常量
{
返回p_;
}
};
int
主要()
{
字符串s(“你好,世界!”);
std::printf(“%s\n”,s.c_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 ());
}
#包括
#包括
#包括
类字符串
{
char*p_;
公众:
显式字符串(常量字符*str)
{
自动长度=std::strlen(str)+1;
p_=新字符[长度];
std::memcpy(p_,str,长度);
}
~String()
{
删除[]p;
p_u=nullptr;
}
内联常量char*c_str()常量
{
返回p_;
}
};
int
主要()
{
字符串s(“你好,世界!”);
std::printf(“%s\n”,s.c_str());
}

您想要这样的东西:您想要这样的东西:从
strdup
返回的字符串的内存是通过
malloc
获得的。考虑到
delete
可能过载,在该内存上调用delete[]是否有潜在危险?也许您应该建议使用
free
释放内存。
new
不会返回
NULL
。第二行应该省略。@phresnel,例如@PeterTörök:So?您没有使用nothrow变量,这就是我编写它的原因。从
strdup
返回的字符串的内存是通过
malloc
获得的。考虑到
delete
可能过载,在该内存上调用delete[]是否有潜在危险?也许您应该建议使用
free
释放内存。
new
不会返回
NULL
。第二行应该省略。@phresnel,例如@PeterTörök:So?你没有使用nothrow变量,这就是我写这个的原因。