2013-03-14 177 views
2

嗨,我是新來的學習C++,我只是有一個快速的問題。在C++中創建數組

如果我正在創建一個包含5個結構的數組,我應該在構造時清除如下所示的數組,或者將其保留爲當我聲明它時。

換句話說是做這樣的事情

person a[5]; 

for(int i = 0; i < 5; i++) 
{ 
    a[i].name= ""; 
    a[i].value= 0; 
} 

一樣做這樣的事情,請大家注意,我基本上都會通過這些循環後,並設置這些值。

person[5]; 
+0

'人[5]'是第6位FYI – 2013-03-14 16:39:59

+1

這真的取決於結構本身的細節。當然你想達到的目標。 – juanchopanza 2013-03-14 16:41:53

回答

2

只有具有靜態存儲持續時間的POD類型在創建時被初始化爲零。但是由於使用未初始化的變量會產生未定義的行爲,因此即使可能是多餘的,也可以明確初始化變量。

但不是在一個循環中對其進行初始化,這是更好地定義一個默認的構造函數,當它被建造,這將初始化的person實例的數據成員:

struct person 
{ 
    person() : value(0) { } 

    std::string name; 
    int value; 
} 

而且還要注意使用STL容器如std::vector比使用
C風格的數組:)更好的主意

+0

「你的結構是一個POD類型」 - 不,它不是,不與'std :: string'裏面。你不需要初始化爲空的字符串「」,它有默認的構造函數,它會這樣做 – 2013-03-14 16:46:46

+0

你不能說它是POD而不知道它的成員是什麼類型。 – juanchopanza 2013-03-14 16:47:57

+0

@juanchopanza,aleguna:編輯。 – LihO 2013-03-14 16:53:34

3

不,你不知道。你需要的是一個合適的默認構造函數person

+0

當然,這具有呈現「人」非聚合的結果。這不是一個問題,但值得一提的是。另外,根據數據成員的類型,用戶定義的默認構造函數可能不是必需的。 – juanchopanza 2013-03-14 16:46:50

2

有沒有什麼原因導致你不能使用vector?這是他們C++的方式,它會更容易,更不容易有這樣的錯誤。這裏有一個例子:

#include <vector> 

std::vector<person> a ; 

a.push_back(person(...)) ; 

此外,如前所述,如果你需要使用數組,然後有默認的構造函數爲person確保你不需要初始化以後。例如:

class person 
{ 
    public: 
    person() : value(0) {...} // default constructor 
}; 
+0

也許他們想要一個固定的大小,總體結構。 – juanchopanza 2013-03-14 16:45:01

+0

@juanchopanza我修改了提及默認ctor,如果他們需要使用數組 – 2013-03-14 16:45:53

3

只寫一個默認的構造函數爲person,假設它是一個structclass。 它將被調用來自動初始化每個數組元素。

一般而言,您應該更喜歡使用std::vector<person>來代替,但您沒有給出足夠的上下文來說明問題。


默認的構造看起來是這樣的:這(注意:std::string都有自己默認的構造函數,所以我們並不需要做任何事情)

struct person { 
    std::string name; 
    int value; 

    person() : value(0) {} 
}; 

現在這個:

person a[5]; 

已正確初始化,沒有進一步的努力。


如果你打算以後反正初始化元素「正常」,然後使用矢量可以更容易地跳過浪費虛擬初始化:

struct person { 
    std::string name; 
    int value; 

    person() : value(0) {} 
    person(std::string const &n, int v) : name(n), value(v) {} 
}; 

std::vector<person> people; 
people.reserve(5); 
// just create each person with the right values in the first place: 
for (int i = 0; i < 5; ++i) { 
    people.push_back(person(get_name(i), get_value(i))); 
} 

最後,如果你不介意有未初始化的內存,你的第一個版本(沒有構造函數和沒有循環)是好的。但是,請注意,丟失跟蹤哪些元素/成員是有效的,哪些是垃圾,是錯誤的肥沃來源。

2

如上人提到的[5]是第六位置

在C++中不使用陣列,而使用載體

0

在第一行,在這裏聲明您的陣列,默認person構造將被調用5次(每個元素的數組一次)。如果您的person構造函數將namevalue元素初始化爲合理的值,則不需要您的循環。

0

不,它們不一樣。

在第一個例子:

person a[5]; 

您正在聲明長度5的陣列型的人,。

然而,這樣的:

person[5] 

這是無效的 - 沒有變量名,被分配沒什麼,沒什麼,你可以通過以後循環。