2

有人可以解释一下 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>()在构造函数中显式设置?

4

3 回答 3

4

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

是的,但地址与构造函数无关。构造函数仅在编译器或堆分配器给定一个有效地址后才初始化一个对象。

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

是的

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

是的

还是我必须在构造函数中显式设置 m_SetStringMember = std::set() ?

如果你想明确这样做

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

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

于 2013-05-02T09:15:13.207 回答
1

m_SetStringMemberstd::set是具有自己的构造函数的类的对象。它由其构造函数正确初始化。

于 2013-05-02T09:14:21.357 回答
0

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

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

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

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

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

于 2013-05-02T12:18:27.443 回答