【发布时间】:2020-10-05 00:24:11
【问题描述】:
我一直在尝试创建自己的字符串类,但在下面的代码中遇到了问题:
String::String(const char *s) : str {nullptr}
{
if(s == nullptr)
{
str = new char[1];
*str = '\0';
}else{
str = new char[std::strlen(*s)+1];
strcpy(*str,*s);
}
}
我传入构造函数的是一个 const char 指针;要获得指针内的值,我必须取消引用它,对吗?但是为什么在将参数放入 strcpy 和 strlen 时不必取消引用指针呢?
如下所示。
String::String(const char *s) : str {nullptr}
{
if(s == nullptr)
{
str = new char[1];
*str = '\0';
}else{
str = new char[std::strlen(s)+1];
strcpy(str,s);
}
}
【问题讨论】:
-
std::strlen不采用“指针内的值”。它需要一个指针。出于同样的原因,您的String构造函数需要一个指针。 -
查看
strlen的签名。它需要一个const char*。 en.cppreference.com/w/cpp/string/byte/strlen 它需要const char*,因为它就是这样设计的。 -
取消引用
const char *将产生char,如果您想对整个字符串而不是单个字符进行操作,这将没有用。 -
你能通过看第一个字符来判断一个字符串有多长吗?或者我在想哪本小说以
'G'开头? -
既然您有兴趣重新创建标准库的一部分(一个有用的练习),您会考虑编写自己的
strlen和strcpy版本吗?这可能会导致理解。
标签: c++ pointers function-pointers