如何在构造函数中初始化 char 数组

How can I initialize char arrays in a constructor?

本文关键字:初始化 char 数组 构造函数      更新时间:2023-10-16

我在声明和初始化字符数组时遇到问题。 它始终显示随机字符。 我创建了一个较小的代码来显示我在较大程序中尝试的内容:

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

我个人更喜欢使用声明行初始化,因为:

  1. 如果不需要构造其他变量,则允许使用生成的默认构造函数
  2. 如果需要多个构造函数,这允许仅在一个位置初始化变量,而不是在所有构造函数初始化列表中初始化变量

话虽如此,使用 char[] 可能会被视为对生成的默认赋值运算符具有破坏性,并且复制/移动构造函数将不起作用。这可以通过以下方式解决:

  1. 使成员const
  2. 使用char*(如果成员将保存除文本字符串以外的任何内容,这将不起作用(
  3. 在一般情况下,应首选std::string