2017-08-01 152 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