如何在构造函数中初始化 char 数组
How can I initialize char arrays in a constructor?
我在声明和初始化字符数组时遇到问题。 它始终显示随机字符。 我创建了一个较小的代码来显示我在较大程序中尝试的内容:
class test
{
private:
char name[40];
int x;
public:
test();
void display()
{
std::cout<<name<<std::endl;
std::cin>>x;
}
};
test::test()
{
char name [] = "Standard";
}
int main()
{ test *test1 = new test;
test1->display();
}
抱歉,如果我的格式不好,我几乎无法弄清楚这个网站,更不用说如何修复我的代码:(
如果没有特别的原因不使用std::string
,请使用std::string
。
但是,如果您确实需要初始化该字符数组成员,则:
#include <assert.h>
#include <iostream>
#include <string.h>
using namespace std;
class test
{
private:
char name[40];
int x;
public:
test();
void display() const
{
std::cout<<name<<std::endl;
}
};
test::test()
{
static char const nameData[] = "Standard";
assert( strlen( nameData ) < sizeof( name ) );
strcpy( name, nameData );
}
int main()
{
test().display();
}
您的构造函数没有name
设置成员变量,而是声明一个局部变量。一旦局部变量在构造函数结束时超出范围,它就会消失。同时,成员变量仍未初始化,并且充满了随机垃圾。
字符数组,您还需要使用老式的函数(如strcpy
(复制到成员变量中。如果您只想将其设置为空字符串,则可以使用 name[0] = 0
初始化它。
由于您使用的是C++,因此我建议使用字符串而不是字符数组。否则,你需要雇用strcpy(或朋友(。
此外,您忘记删除 test1 实例。
#include <iostream>
#include <string>
class test
{
private:
std::string name;
int x;
public:
test();
void display()
{
std::cout<<name<<std::endl;
}
};
test::test()
{
name = "Standard";
}
int main()
{
test test1;
test1.display();
std::cin>>x;
}
考虑到您将问题标记为C++,您应该使用 std::string
:
#include <string>
class test
{
private:
std::string name;
int x;
public:
test();
void display()
{
std::cout<<name<<std::endl;
std::cin>>x;
}
};
test::test() : name("Standard")
{
}
c++11 实际上提供了两种方法来做到这一点。可以在其声明行上默认成员,也可以使用构造函数初始化列表。
声明行初始化示例:
class test1 {
char name[40] = "Standard";
public:
void display() { cout << name << endl; }
};
构造函数初始化示例:
class test2 {
char name[40];
public:
test2() : name("Standard") {};
void display() { cout << name << endl; }
};
您可以在此处查看这两个的实时示例:http://ideone.com/zC8We9
我个人更喜欢使用声明行初始化,因为:
- 如果不需要构造其他变量,则允许使用生成的默认构造函数
- 如果需要多个构造函数,这允许仅在一个位置初始化变量,而不是在所有构造函数初始化列表中初始化变量
话虽如此,使用 char[]
可能会被视为对生成的默认赋值运算符具有破坏性,并且复制/移动构造函数将不起作用。这可以通过以下方式解决:
- 使成员
const
- 使用
char*
(如果成员将保存除文本字符串以外的任何内容,这将不起作用( - 在一般情况下,应首选
std::string
相关文章:
- 使用指针初始化 char 数组或字符串 C++
- 需要帮助在 c++ 中将字符串转换为字符 ----错误 "const char *" 类型的值不能用于初始化 "char" 类型的实体
- c ++ 如何在构造函数中初始化 char
- 用字节初始化 char* 和 std::字符串
- C++:无法使用条件类型在模板函数中使用 'double' 类型的 lvalue 初始化 'char*' 类型的参数
- 初始化char数组和具有整数文字的char时的差异
- 使用表达式初始化char*无效
- 在类构造函数中初始化 Char 数组成员C++
- 在C 中的构造函数的初始化列表中初始化char数组
- 在C 中,这是用字符串文字初始化char数组的好习惯
- 值类型 const char 不能用于初始化 char* 类型的实体
- 如何初始化 char*[] 数组
- char的值不能用于初始化char*的实体
- 如何在c中重新初始化char*变量
- 如何在c++类中初始化char*?(sizeof()总是给出8)
- 通过传递的指针段错误初始化 char 数组
- 如何在构造函数中初始化 char 数组
- 初始化char数组以容纳非null终止的字符串
- char*类型的值不能用于初始化“char”类型的实体
- 用c++中的字符串初始化char Buffer