2013-05-02 153 views
2

有人可以解释我如何在c + +中的内存分配和初始化工作?没有构造函数的C++类成员初始化

File Test.h 
----------- 
class Test 
{ 
    public: 
     Test(); 

     void clearSet(); 

    private: 
     std::set<std::string> m_SetStringMember; 
     int m_initMe; 
} 

File Test.cpp 
------------- 

Test::Test():m_initMe(0) 
{} 

Test::clearSet() 
{ 
    m_SetStringMember.clear(); 
} 

什么我不明白的是:
intm_initMe是正确初始化在构造函数中,因此在内存的有效ADRESS和有效值。
m_SetStringMember会发生什么情况?
它是否必须在内存中有一个有效的地址?
它是否必须具有有效的默认值?
std::set<std::string>()的默认构造函数设置?
或者我必须在构造函数中明确设置m_SetStringMember = std::set<std::string>()

+0

它具有不确定的价值。同样的事情适用于'm_SetStringMember',但它通过默认的构造函数调用,它会给它一个有效的状态。 – 2013-05-02 09:15:25

回答

1

m_SetStringMember是具有它自己的构造函数的类std::set的对象。它的构造函数正确地初始化了它。

+0

因为它被分配在堆栈上!如果你有一个指针,那将是垃圾。 – 2013-05-02 09:15:53

+4

@ bash.d:如果它是一个指针,它不会是类std :: set的对象。 – 2013-05-02 09:17:33

+1

对不起?如果我'std :: set * m_SetStringMember;'它必须使用'new'分配,否则它将包含垃圾。 ' – 2013-05-02 09:19:55

4

但是,m_SetStringMember会发生什么? 它是否必须在内存中有一个有效的地址?

是的,但地址与构造函数无关。只有编译器或堆分配器给出了有效地址后,构造器才会初始化对象。

是否必须具有有效的默认值?

由STD()的默认构造函数:: set设置?

还是我必须要明确设置m_SetStringMember = 的std ::设置()在构造函数?

如果你想明确这样做

Test::Test() : m_initMe(0), m_SetStringMember() {} 

,但同样的事情会被默认OO发生。

+0

只需要注意,编译器并不提供有效的地址。这是一个运行时间活动。 – 2013-05-02 09:25:56

0

一个更增编约翰的正确后:

在这些变量将初始化是在声明它,所以实际上,如果你想成为明确的,你应该这样做的订单的订货:

Test::Test() : m_SetStringMember(), m_initMe(0) {} 

确保初始化列表中的顺序与您声明它们的顺序相匹配是一个很好的练习,甚至可以让编译器警告您。很多时候你的变量最终会依赖于彼此,因此顺序很重要。另外,如果你没有指定一个默认值,那么将使用类的默认构造函数(如果你没有创建它,那么编译器会为你生成一个,并假设它是可用的,即没有任何访问限制) - 方面注意:请查看关于创建C++类构造函数的通用策略的3规则。如果变量是POD(普通旧数据类型 - 整数,浮点数等),那么它将默认为0.即使您不初始化具有内存的“m_initMe”(当您创建对象时),它也会默认为0.

相关问题