2017-08-01 195 views
-1

在初始化其他成員時,是否可以省略初始化struct的成員?在初始化其他成員時跳過結構成員的初始化

例如,這是我struct

struct person { 
    std::string name; 
    int age; 
    float weight; 
}; 

雖然初始化它,我想跳過初始化age,但初始化其他成員。 例如,我創建了一個person類型的變量p。如果我想給所有成員賦予價值,我就會這樣做。

person p = {"harry", 25, 70}; 

相反,我想知道是否可以省略賦予值「25」年齡到person p(只爲這個特殊的結構變量)的同時,只是給的值與其他兩個。像for循環中,我們可以保留爲空這樣

for(int i=0;;i++) 

跳過任何參數,我知道,結構未在任何地方與循環,我提到它只是解釋跳過初始化究竟我的意思是什麼age

+1

您應該使用'的std :: string',而不是'的char []' – CoryKramer

+2

你已經成功地跳過初始化它們中的任何到目前爲止你在正確的軌道上 – systemcpro

+3

寫肯定構造並省略了年齡的初始化代碼。 – hetepeperfan

回答

1

成員是一個基本型的不會自動初始化爲C++的任何特定值,除非對象是靜態的存儲類的(如聲明static全局變量或變量)在這種情況下它們被初始化爲0。

所以你不需要做任何特別的事情。只是不要初始化你不想具有特定價值的成員。

目前,只有name被初始化爲已知值在你的結構(因爲使用的std::string默認構造函數。)如果你想初始化一切,除了age,則:

struct person { 
    std::string name; // default constructed to empty string 
    int age; // unspecified value 
    float weight = 0.f; 
}; 
+2

*「成員不會自動初始化在C++」* - 這是錯誤的和誤導。對於沒有明確初始化的所有成員,總是會發生默認初始化。對於基本類型來說,這種初始化是無操作並不意味着它不會從類型系統的角度出現。 – StoryTeller

+0

基本類型_自動初始化,意思是對象的生命週期開始並且它可以被賦值爲有效;它恰好有一個不確定的價值。 –

1

不幸的是,你的問題不清楚。

  1. 你想age被留下未初始化的每一個person或只對某些person S'
  2. 您如何區分person的年齡是從哪個年齡初始化的,併爲其分配了一個有意義的值?

正如評論所說,成員將在建設初始,無論是在構造函數中指定,或作爲成員聲明中指定的或默認初始化。對於基本類型(如int),後者不會設置一個值,以便存儲的實際值可以是任何值,包括非感性(NaN爲float)。

保持基本類型默認初始化(因此爲未指定值)的唯一原因是爲了提高效率(例如分配大量數據時)。但是,這不是這種情況。因此,您應該使用所有成員的默認值,這些值對於真實的person s(以表明它們僅僅是未指定的或「未知的」)是沒有意義的。例如

struct person 
{ 
    std::string name; // default: empty 
    int age = -1;  // idea: match age < 0 to 'unknown' 
    float weight = 0; // idea: match weight <= 0 to 'unknown' 
    person(std::string const&n) : name(n) {} 
    person(std::string const&n, int a) : name(n), age(a) {} 
    person(std::string const&n, float w) : name(n), weight(w) {} 
    person(std::string const&n, int a, float w) : name(n), age(a), weight(w) {}  
}; 

person A{Utkarsh};   // unknown age, unknown weight 
person B{Utkarsh,70.0};  // unknown age, weight=70 
person C{Utkarsh,25};  // age=25, unknown weight 
person D{Utkarsh,25,70.0}; // age=25, weight=70 
+1

我只是在評論中發佈了相同的內容:) +1對於細節並詢問是否真的需要未初始化的年齡;這可能是一個x/y問題 –