2011-04-27 41 views
3

結構初始化我有類似結構這些關於C++

typedef struct sample 
{ 
     double x, 
     double y, 
     double z 
}s1; 
s1 s; 

將以秒變量的初始化內容還是不?

x,y,z的值是多少?如果s是在功能範圍內定義

感謝

+3

需要注意的是,在C++中,你不會經常看到'typedef結構富{...'。這是因爲在C++中,與C不同,所有結構名稱也都是類型名稱。在C++中,你可以寫:'struct sample {};樣本s;'。 – 2011-04-27 16:39:27

回答

9

xyz不會被初始化。它們將包含一些未指定的值。在文件範圍內,數據成員將被初始化爲默認值。

在C++但是你可以有一個構造函數初始化列表來初始化數據成員

例如

struct ABC 
{ 
    int x; 
    int y; 

    ABC(): x(1),y(2){} 
}; 

ABC s; // x and y initialized to 1 and 2 respectively 

在C++中也有default initialization and value initialization初始化數據成員。

+2

在C++中,「不會被初始化」是錯誤的。這取決於。 – 2011-04-27 07:10:59

+0

@Jan:是的,它取決於對象是在函數範圍還是在文件範圍 – 2011-04-27 07:13:31

+0

處定義。但是,如果在全局範圍聲明's',將不會使用零初始化x和y? – 2011-04-27 07:14:05

2

如果是C++,你可以創建構造函數。

struct s1 
{ 
    s1(const double x = 0.0, const double y = 0.0, const double z = 0.0) 
    : x(x), y(y), z(z) 
    { 
    }; 
    double x; 
    double y; 
    double z; 
}; 

s1 s; 
+0

但是,您不必製作構造函數,仍然可以將它們初始化爲零。 – 2011-04-27 07:11:24

+0

你應該使構造函數爲'explicit',任何可以用一個參數調用的構造函數都容易打開系統進行不必要的轉換:'void foo(s1 const &); foo(x);'如果'x'是算術類型,該代碼可能是一個錯誤,但實際上通過將'x'轉換爲's1'作爲's1(x)',然後調用'foo'來實現。通常使構造函數更加明確,並且如果上面的代碼是故意的,用戶將不得不明確地請求轉換:'foo(s1(x));'這不是一個負擔太多 – 2011-04-27 07:19:23

4

在您提供的代碼中,這些字段將被初始化。你可以添加一個構造函數(如果你需要/可以),或者如果你需要POD-ness(你的代碼的某些部分取決於其中一些屬性),並且你不能添加構造函數,你仍然可以使用值初始化在使用場所的結構(即每個成員設置爲0):現在

struct sample  // typedef not required 
{ 
    double x, 
    double y, 
    double z 
}; 
sample s = sample(); // will set all members to 0.0 

,如果你想初始化一些特定的價值觀不同的成員,因爲它是一個聚合,你可以使用集合初始化:

sample s = { 1.0, 3.0 }; 

,將設置x1.0y3.0。由於z沒有值,因此編譯器將其設置爲0.0。請注意,這意味着sample s = {};相當於sample s = sample();

+0

另請參見[this question](http://stackoverflow.com/questions/4932781 /爲什麼是一個pod-in-a-struct-zero-initial-by-an-implicit-constructor-when-creatin),以便更詳細地描述默認值與初始值的關係 – 2011-04-27 07:19:03

1

內置類型,如doubleint被初始化變量是否staticnamespace /文件範圍內,否則 - 出於效率的考慮 - 他們沒有初始化,除非構造表明這很有用。

注意:此答案解決了「s1 s」問題你描述的情況。定義變量時可以提供明確的初始化,但這是另一種情況。

要添加一個構造函數,因此:

struct X 
{ 
    X() : x_(0), y_(0), z_(0) { } 
    double x, y, z; 
}; 
+0

就像缺乏其他2個已經存在的答案。 – 2011-04-27 07:18:38