11

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

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();
}

抱歉,如果我的格式不好,我几乎无法弄清楚这个网站,更不用说如何修复我的代码了 :(

4

5 回答 5

10

如果没有特别的理由不使用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();
}
于 2012-05-02T22:30:47.837 回答
6

您的构造函数没有设置成员变量name,而是声明了一个局部变量。一旦局部变量在构造函数结束时超出范围,它就会消失。同时成员变量仍然没有初始化并且被随机垃圾填充。

如果要使用老式字符数组,还需要使用老式函数,例如strcpy复制到成员变量中。如果您只想将其设置为空字符串,则可以使用name[0] = 0.

于 2012-05-02T22:28:45.940 回答
5

考虑到您将问题标记为 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")
{

}
于 2012-05-02T22:23:28.717 回答
4

由于您使用的是 C++,我建议使用字符串而不是 char 数组。否则,您需要使用 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;
}
于 2012-05-02T22:23:21.743 回答
3

实际上提供了两种方法来做到这一点。您可以在其声明行中默认成员,也可以使用构造函数初始化列表。

声明行初始化示例:

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. 在需要多个构造函数的情况下,这允许变量仅在一个位置初始化,而不是在所有构造函数初始化列表中

说了这么多,使用 achar[]作为生成的默认赋值运算符可能会被认为是有害的,并且复制/移动构造函数将不起作用。这可以通过以下方式解决:

  1. 制作会员const
  2. 使用 a char*(如果成员将包含除文字字符串之外的任何内容,则此方法将不起作用)
  3. 一般情况下std::string应该优先
于 2015-09-16T00:40:13.030 回答