嗨,我是新來的學習C++,我只是有一個快速的問題。在C++中創建數組
如果我正在創建一個包含5個結構的數組,我應該在構造時清除如下所示的數組,或者將其保留爲當我聲明它時。
換句話說是做這樣的事情
person a[5];
for(int i = 0; i < 5; i++)
{
a[i].name= "";
a[i].value= 0;
}
一樣做這樣的事情,請大家注意,我基本上都會通過這些循環後,並設置這些值。
person[5];
嗨,我是新來的學習C++,我只是有一個快速的問題。在C++中創建數組
如果我正在創建一個包含5個結構的數組,我應該在構造時清除如下所示的數組,或者將其保留爲當我聲明它時。
換句話說是做這樣的事情
person a[5];
for(int i = 0; i < 5; i++)
{
a[i].name= "";
a[i].value= 0;
}
一樣做這樣的事情,請大家注意,我基本上都會通過這些循環後,並設置這些值。
person[5];
只有具有靜態存儲持續時間的POD類型在創建時被初始化爲零。但是由於使用未初始化的變量會產生未定義的行爲,因此即使可能是多餘的,也可以明確初始化變量。
但不是在一個循環中對其進行初始化,這是更好地定義一個默認的構造函數,當它被建造,這將初始化的person
實例的數據成員:
struct person
{
person() : value(0) { }
std::string name;
int value;
}
而且還要注意使用STL容器如std::vector
比使用
C風格的數組:)更好的主意
「你的結構是一個POD類型」 - 不,它不是,不與'std :: string'裏面。你不需要初始化爲空的字符串「」,它有默認的構造函數,它會這樣做 – 2013-03-14 16:46:46
你不能說它是POD而不知道它的成員是什麼類型。 – juanchopanza 2013-03-14 16:47:57
@juanchopanza,aleguna:編輯。 – LihO 2013-03-14 16:53:34
不,你不知道。你需要的是一個合適的默認構造函數person
當然,這具有呈現「人」非聚合的結果。這不是一個問題,但值得一提的是。另外,根據數據成員的類型,用戶定義的默認構造函數可能不是必需的。 – juanchopanza 2013-03-14 16:46:50
有沒有什麼原因導致你不能使用vector?這是他們C++的方式,它會更容易,更不容易有這樣的錯誤。這裏有一個例子:
#include <vector>
std::vector<person> a ;
a.push_back(person(...)) ;
此外,如前所述,如果你需要使用數組,然後有默認的構造函數爲person
確保你不需要初始化以後。例如:
class person
{
public:
person() : value(0) {...} // default constructor
};
也許他們想要一個固定的大小,總體結構。 – juanchopanza 2013-03-14 16:45:01
@juanchopanza我修改了提及默認ctor,如果他們需要使用數組 – 2013-03-14 16:45:53
只寫一個默認的構造函數爲person
,假設它是一個struct
或class
。 它將被調用來自動初始化每個數組元素。
一般而言,您應該更喜歡使用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)));
}
最後,如果你不介意有未初始化的內存,你的第一個版本(沒有構造函數和沒有循環)是好的。但是,請注意,丟失跟蹤哪些元素/成員是有效的,哪些是垃圾,是錯誤的肥沃來源。
如上人提到的[5]是第六位置
在C++中不使用陣列,而使用載體
在第一行,在這裏聲明您的陣列,默認person
構造將被調用5次(每個元素的數組一次)。如果您的person
構造函數將name
和value
元素初始化爲合理的值,則不需要您的循環。
不,它們不一樣。
在第一個例子:
person a[5];
您正在聲明長度5的陣列型的人,。
然而,這樣的:
person[5]
這是無效的 - 沒有變量名,被分配沒什麼,沒什麼,你可以通過以後循環。
'人[5]'是第6位FYI – 2013-03-14 16:39:59
這真的取決於結構本身的細節。當然你想達到的目標。 – juanchopanza 2013-03-14 16:41:53