在类构造函数中初始化 Char 数组成员C++
Initializing Char array member in C++ class constructor
我必须在 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;
} ;
如何初始化初始化列表中的成员
m_sTYPE1
如果 ctor 中没有任何内容,使用
"ABCDE"
调用SetArr
会在strncpy
崩溃时引发错误。我认为这是因为m_sTYPE1.arr
没有正确初始化。如何初始化并稍后设置字符串?
使用字符串C++整个事情变得容易得多,但在这里我只对 C 样式的字符数组实现感兴趣。
- 如何在初始化列表中初始化成员m_sTYPE1
使用列表初始化(在本例中为聚合初始化):
A::A(): m_sTYPE1{} {}
- 在 ctor 中没有任何内容的情况下,使用 "ABCDE" 调用 SetArr 会抛出错误,因为 strncpy 崩溃。我认为这是因为m_sTYPE1.arr 未正确初始化。
在构造函数中初始化m_sTYPE1
对SetArr
是否"引发错误"没有影响。复制未初始化的内存是完全安全的。如果strncpy
"崩溃",那么其他地方就存在错误。不可能说在哪里,因为你的例子不完整。
C++不是Java,你已经声明了私有成员S_TYPE1 m_sTYPE1
,它将简单地存在于类A
的每个实例中,它不是指针或引用,因此不需要指向或引用现有对象。
如果您所说的初始化列表是指要在构造A
时设置字节范围 - 我建议声明一个接受const char* const
的构造函数,然后从中复制数据。定义一个构造函数,如果要移动,该构造函数采用char*&&
。
但是,看看你的例子,我还会提到数组在 C/C++ 中是从零开始的,因此声明 arr[6]
给你 0-5
之间的有效索引,6 是越界的,尝试访问它或写入它将导致未定义的行为(阅读:可能会使程序崩溃),因此手动设置 null 终止符的代码行将不起作用。
相关文章:
- 为什么我无法访问指向数组中成员函数的指针?
- 如何将结构/联合数组的成员传递到函数中
- 使用带有参数包的数组的成员数组初始化类
- 有没有办法给数组的成员指定不同的名称?
- 使用包含结构的数组的成员函数
- C++:释放动态数组(结构成员)和指向此结构的指针的方法
- C 用数组作为成员创建对象
- 用另一个 constexpr 数组对成员数组进行大括号初始化
- 来自数组的成员和比特菲尔德的结构
- 如何创建指向数组类成员的指针?
- 将数组的成员设置为零
- "Empty"数组\向量成员 C++
- 功能指针数组(包括成员功能)投掷模板专业化错误
- 另一个结构内部的结构数组的成员变量没有通过引用传递
- 正确转换 2D 数组的成员变量
- 常量数组类成员初始化
- 为具有对象或对象数组作为成员的类运行不同的代码
- C++ 如何指向数组的成员
- 将包含数组数据成员的结构保存到文件
- 数组类成员初始化(C++)