2017-08-01 70 views
5

我有一些非常簡單的C++代碼來顯示問題。我用ctor中的值初始化我的數組。但是當我嘗試訪問main中的數組時,這些值被替換爲隨機數。爲什麼?不保存初始化值的數組

//Example to figure out why initialization values are disappearing 
#include <iostream> 

struct Struct1 
{ 
    float array1[2]; 

    //ctor 
    Struct1(); 
}; 

Struct1::Struct1() 
{ 
    float array1[] = {0.2,1.3}; 
} 

int main() 
{ 
    Struct1 StructEx; 

    std::cout<<StructEx.array1[0]<<' '; 
    std::cout<<StructEx.array1[1]<<std::endl; 

    return 0; 
} 
+4

'float array1 [] = {0.2,1.3};'在構造函數中創建一個新的* local *變量'array1'。 – crashmstr

+0

將ctor中的'float'指向成員變量 - 並且在可能的時候更喜歡在ctor主體上使用初始化列表。 –

+1

這是如何得到4 upvotes? :o沒有違法行爲,但這是有點基本的。 – HolyBlackCat

回答

6

作爲@crashmstr提到,您不初始化結構的成員,而是一個局部變量。下面的代碼應該工作:

struct Struct1 
{ 
    float array1[2]; 
    //ctor 
    Struct1(); 
}; 

Struct1::Struct1() 
: array1 ({0.2,1.3}) 
{ 
} 

int main() 
{ 
    Struct1 StructEx; 

    std::cout<<StructEx.array1[0]<<' '; 
    std::cout<<StructEx.array1[1]<<std::endl; 

    return 0; 
} 
+1

在這種情況下,我說,就地初始化。沒有必要爲此提供構造函數。 – SergeyA

+0

我是否正確地說在ctor中使用「float」使其成爲局部變量? – MrMoe

+0

@MrMoe - 是的,沒錯。 –

1

上的警告開關(-Wall)編譯時,你會看到

  • float array1[]={0.2,1.3};未使用
  • StructEx.array1[0]StructEx.array1[0]是未初始化的

在構造函數中加上這個

array1[0]=0.2; 
array1[1]=1.3; 
+0

ChrisB的回答也是正確的(在這種情況下也許更好)。 – Elyasin

+0

這看起來非常有用。謝謝 – MrMoe

+0

如果這還沒有問到,你可能會問這是一個新問題。答案可能比我想象的要好得多。我不熟悉make文件。 – Elyasin