没有构造函数的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_SetStringMember
是类std::set
的一个对象,它有自己的构造函数。它的构造函数正确地初始化了它。
John正确帖子的另一个附录:
这些变量初始化的顺序就是它们被声明的顺序,所以实际上,如果你想显式,你应该这样做:
Test::Test() : m_SetStringMember(), m_initMe(0) {}
确保初始化列表中的顺序与您声明它们的顺序匹配是一种很好的做法,甚至可以让编译器警告您。很多时候,你的变量最终会相互依赖,因此顺序很重要。
此外,如果您没有指定默认值,那么将使用类默认构造函数(如果您没有创建它,编译器将为您生成一个,并假设它是可用的,即没有任何访问限制(——附带说明:查看创建c++类构造函数的公共策略中的3规则。如果变量是POD(普通的旧数据类型——int、float等(,那么它将默认为0。
- C++成员初始化
- c++构造函数成员初始化:传递参数
- C++正确的指针成员初始化
- 将另一个类的对象传递到当前类C++的构造函数中(不是成员初始化)
- WinLamb 错误:成员初始化非法
- 使用其他成员初始化结构的成员?
- C++模板类静态成员初始化
- 解释了构造函数成员初始化列表
- 如何在成员初始化列表中声明共享指针
- C++入门5版:使用get成员初始化另一个与shared_ptr无关的对象
- C++11 默认类成员初始化与初始值设定项列表同时
- 调用非默认构造函数作为成员初始化
- C++模板成员初始化:用右值移动构造,但用左值移动引用
- 类成员初始化C++
- 在成员初始化列表中,我可以创建对列表中不在列表中的成员变量的引用
- C :(不重复)积分静态成员初始化(不仅是声明!),导致链接器错误,原因
- 如何调用成员初始化器列表中参考成员的构造函数
- C 构造函数采用成员初始化器
- 与其他静态const成员初始化静态常量成员
- 静态内联成员初始化顺序