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

时间:2016-05-31 11:57:56

标签: c++ c

我必须在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]='\0';
  }
private:
  STYPE1 m_sTYPE1;
} ;
  1. 如何初始化初始化列表中的成员m_sTYPE1

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

  3. 使用C ++字符串可以轻松完成整个过程,但在这里我只对C-Style字符串数组实现感兴趣。

2 个答案:

答案 0 :(得分:1)

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

使用列表初始化(在这种情况下进行聚合初始化):

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

在构造函数中初始化m_sTYPE1不会影响SetArr" 是否会抛出错误"。复制未初始化的内存是完全安全的。如果strncpy" 崩溃",那么其他地方就会出现错误。无法说出去哪里,因为你的例子并不完整。

答案 1 :(得分:0)

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

如果通过初始化列表表示你想在构造A时设置字节范围 - 我建议声明一个接受const char* const的构造函数,然后复制数据从中。如果要移动,请定义一个带char*&&的构造函数。

然而,看看你的例子,我还要提到数组在C / C ++中是零基础的,因此声明arr[6]给出0-5之间的有效索引,6超出范围并且尝试访问它或写入它将导致未定义的行为(读取:可能会使程序崩溃),因此手动设置空终止符的代码行将无效。