繁体   English   中英

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

[英]c++ class member initialization without constructor

有人可以解释一下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>()

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

是的,但是地址与构造函数无关。 构造器仅在编译器或堆分配器为对象指定了有效地址后,才对其进行初始化。

它必须具有有效的默认值吗?

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

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

如果您想明确,请执行此操作

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

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

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

John正确文章的又一个补遗:

这些变量初始化的顺序就是声明它们的顺序,因此实际上,如果要明确,则应这样做:

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

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

此外,如果您未指定默认值,则将使用类默认构造函数(如果您不创建默认编译器,并且假设它可用,则编译器将为您生成一个),即- -旁注:在创建c ++类构造函数的通用策略中检查3规则。 如果变量是POD(普通旧数据类型-int,float等),则它将默认为0。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM