使用字符串文字分配 char 数组类成员

Posted

技术标签:

【中文标题】使用字符串文字分配 char 数组类成员【英文标题】:Assign a char array class member using string literal 【发布时间】:2021-06-08 18:21:48 【问题描述】:

如果我这样创建我的课程:

class MyCLass 
private:
    char name[25];
public:
    MyClass();
    MyClass(char name[]);
;
MyClass::MyCLass() 
    stringCopy("", this->name);

MyCLass::MyClass(char name[]) 
    stringCopy(name, this->name);

其中stringCopy 是我复制两个字符数组的函数,当我在main 函数中创建对象MyClass obj("John"); 时,名称分配正确,但我收到以下警告:ISO C++11 does not allow conversion from string literal to 'char *',所以我问自己:将 char 数组初始化为类成员的正确和最佳方法是什么?

首先,我不喜欢我初始化char name[25]; 的方式,但唯一的选择是使用动态内存。还有比这两个更好的选择吗?

另外,虽然我在编译代码后得到的消息只是一个警告,但我宁愿避免在我的代码中出现这种潜在的冲突。除了使用名称创建一个 char 数组,然后创建一个对象并将这个新变量作为参数传递之外,还有其他方法可以避免这个问题吗?

编辑:我错过了那个细节:我需要使用 char 数组。不允许使用任何字符串。

【问题讨论】:

构造函数MyCLass::MyClass(char name[]) 需要是MyCLass::MyClass(const char name[])。字符串文字是 const char[] 在 C++ 中为您自己的理智使用 std::string。使用 C 字符串只不过是一团糟,尤其是在这种情况下,您的长度限制 (25) 没有在任何地方宣传,也没有记录在案,也不容易被发现。 如果必须使用字符数组,请查看str*() 标准函数,例如stdcpystrcmp。否则使用std::string @tadman 我完全同意你的看法,但使用 cString 是这项任务的要求。此外,鼓励创建我自己的 stdcpy 函数。 @FrançoisAndrieux 这回答了我的一个问题。谢谢! 【参考方案1】:

鉴于 cmets 中的建议,您可能会采取一些措施:

class MyCLass 
private:
    std::string name;
public:
    MyClass(std::string & n = ""):name(std::move(n));
;

在这种复制中使用StringCopy() 函数没有意义,标准库中的函数已经做得很好()

【讨论】:

所有这些都可以解析为单个ctor,MyClass(std::string s = "") : name(std::move(s))

以上是关于使用字符串文字分配 char 数组类成员的主要内容,如果未能解决你的问题,请参考以下文章

将字符串文字分配给 char* [重复]

删除 char** 数组的正确方法

JAVA中的String类

c ++在类外部分配char数组的索引

为啥在 c++ 中分配 char 数组元素时,分配的字符被破坏?

arduino中char item是啥意思