没有构造函数的c ++类成员初始化

时间:2013-05-02 09:11:34

标签: 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(); 
}

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

3 个答案:

答案 0 :(得分:4)

  

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

是的,但地址与构造函数无关。构造函数只有在编译器或堆分配器为其提供有效地址后才初始化对象。

  

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

  

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

  

或者我必须明确设置m_SetStringMember =   构造函数中的std :: set()?

如果你想明确这样做

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

但默认情况下会发生同样的事情。

答案 1 :(得分:1)

m_SetStringMember是类std::set的一个对象,它有自己的构造函数。它由构造函数正确初始化。

答案 2 :(得分:0)

约翰的正确帖子的另一个附录:

这些变量初始化的顺序是它们的声明顺序,所以实际上如果你想要明确,你应该这样做:

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

确保初始化列表中的顺序与您声明它们的顺序相匹配是一个很好的做法,您甚至可以让编译器发出警告。很多时候你的变量会相互依赖,因此顺序很重要。

此外,如果您没有指定默认值,那么将使用类默认构造函数(如果您不创建它,您的编译器将为您生成一个,并假设它可用,即没有任何访问权限)限制) - 旁注:关于创建c ++类构造函数的通用策略,请查看规则3。如果变量是POD(普通旧数据类型 - 整数,浮点数等),则默认为0。