2012-05-02 101 views
9

我无法声明和初始化char数组。它总是显示随机字符。我创建的代码更小一点,以显示我想要在我的大计划:如何初始化构造函数中的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(); 
} 

很遗憾,如果我的格式是坏的,我可以勉强找出这个网站更不用说如何修复我的代码:(

+0

相关:[我如何使用成员初始化列表来初始化它?](http://stackoverflow.com/q/5602030/636019) – ildjarn

+0

好吧,所以我现在使用std :: string,但是在更大的程序中,这是因为我使用了这样的get函数:void get(char prompt [],int size,char b [])其中char b []是我以前的char数组。我将如何修改它以便将字符串传递给我的get函数? – ShengLong916

+0

返回'std :: string'对象而不是'void'。 – ildjarn

回答

4

由于您使用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; 
} 
+0

非常感谢你们,你们真棒! – ShengLong916

+1

用于char数组的用例:C++可用于std lib不在的地方,如微控制器。 –

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") 
{ 

} 
+0

非常感谢您的帮助。 – ShengLong916

+0

我永远不会明白,如果“相同”答案发布_later_会得到更多upvotes。而我的回答可以说(相当多)从一开始就更加完整...... – sehe

+0

我真的没有得到这个网站,但我试图upvote但不能。抱歉。 – ShengLong916

6

您的构造方法中没有设置成员变量name,声明它的一个局部变量。一旦局部变量超出构造函数末尾的范围,它就会消失。与此同时,成员变量仍然没有初始化,并被随机垃圾填充。

如果你打算使用老式的字符数组,你还需要使用一个老式的函数,如strcpy来拷贝到成员变量中。如果您只想将其设置为空字符串,则可以使用name[0] = 0对其进行初始化。

9

如果没有特别的理由不使用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(); 
} 
+1

我认为'主体'是一个有点神秘,衡量OP的学习阶段:) – sehe

+0

所以我决定使用std :: string,但根据我上面的评论,我将如何传递一个字符串到另一个函数? – ShengLong916

2

实际上提供了这样的方法有两种。您可以在其声明行上默认成员,也可以使用构造函数初始化列表。报关行初始化

例子:

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应首选:这可以通过解决
相关问题