在类构造函数中初始化 Char 数组成员C++

Initializing Char array member in C++ class constructor

本文关键字:数组 组成员 C++ Char 初始化 构造函数      更新时间:2023-10-16

我必须在 c++ 类中使用 c 样式结构(我可以处理字符串,但我必须专门使用带有 char 数组的 C 样式结构)作为

typedef struct
{
 char arr[6];
} STYPE1;
class A
{
 public:
  void SetArr( const char* str ) { 
       strncpy(m_sTYPE1.arr , str , 5);
       m_sTYPE1.arr[5]='';
  }
private:
  STYPE1 m_sTYPE1;
} ;
  1. 如何初始化初始化列表中的成员m_sTYPE1

  2. 如果 ctor 中没有任何内容,使用 "ABCDE" 调用 SetArr会在strncpy崩溃时引发错误。我认为这是因为m_sTYPE1.arr没有正确初始化。如何初始化并稍后设置字符串?

使用字符串C++整个事情变得容易得多,但在这里我只对 C 样式的字符数组实现感兴趣。

  1. 如何在初始化列表中初始化成员m_sTYPE1

使用列表初始化(在本例中为聚合初始化):

A::A(): m_sTYPE1{} {}
  1. 在 ctor 中没有任何内容的情况下,使用 "ABCDE" 调用 SetArr 会抛出错误,因为 strncpy 崩溃。我认为这是因为m_sTYPE1.arr 未正确初始化。

在构造函数中初始化m_sTYPE1SetArr是否"引发错误"没有影响。复制未初始化的内存是完全安全的。如果strncpy"崩溃",那么其他地方就存在错误。不可能说在哪里,因为你的例子不完整。

C++不是Java,你已经声明了私有成员S_TYPE1 m_sTYPE1,它将简单地存在于类A的每个实例中,它不是指针或引用,因此不需要指向或引用现有对象。

如果您所说的初始化列表是指要在构造A时设置字节范围 - 我建议声明一个接受const char* const的构造函数,然后从中复制数据。定义一个构造函数,如果要移动,该构造函数采用char*&&

但是,看看你的例子,我还会提到数组在 C/C++ 中是从零开始的,因此声明 arr[6] 给你 0-5 之间的有效索引,6 是越界的,尝试访问它或写入它将导致未定义的行为(阅读:可能会使程序崩溃),因此手动设置 null 终止符的代码行将不起作用。