2012-05-02 105 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應首選:這可以通過解決
相關問題