初始数据成员值
Initial data member values
本文关键字:数据成员 更新时间:2023-10-16
我非常惊讶地看到,在VS2013附带的Visual c++ 版本中,新创建类的数据成员似乎根据其类型自动初始化为0或null。这是新的,非常有用!——以我的经验来看。我以前只在编写严肃的应用程序时使用过 vc++版本4,早在20世纪90年代中期,初始值是明确地将声明为未定义/随机。
这可能是使用调试库的一些有用属性,或者有可能一直依赖于null初始化吗?
按要求,一些示例代码-恐怕没有什么很令人兴奋的:
class CData
{
public:
CData();
CData(const CData ©);
~Data();
const CData& operator=(const CData ©);
//Accessors/Mutators follow...
private:
bool Initialize_Data();
//Just giving a couple of examples of data member sets.
char *input_script_name;
int size_input_script_name;
int size_input_script_name_buffer;
char *interpreter_name;
int size_interpreter_name;
int size_interpreter_name_buffer;
};
CData::CData()
{
Initialize_Data();
}
CData::~CData()
{
//Code to store relevent data in registry
//and then free dynamically allocated memory follows...
}
bool CData::Initialize_Data()
{
//Code to retrieve data from registry stored at end of last run follows
//along with routines to check bounds.
//
//At this point, without executing any further a breakpoint is triggered
//and on inspecting data members in a Watch on 'this' I find them
//to be already initialized to either 0 or null respectively.
}
...
int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
//Application entry point;
CData application_data; //and away it goes!
//Usual name mutex to prevent multiple instances and message loop follow...
}
正如我所说的非常基本,我没有说明所有的代码。然而,在到达'Initialize_Data'中的断点时——即在创建类和执行任何其他操作之前——所有数据成员在Watch中显示为0或null。这是相当令人惊讶的!
这只是一个巧合。你可能会注意到,在对象初始化之前,有东西清除了大量内存,然后你的对象被放在零初始化的内存中。不能保证这种情况会继续存在,也不能在其他平台/编译器上依赖它。在调试模式下,visualc++实际上会尝试清除为非零位模式,例如。
如果想要零初始化,可以使用c++ 11的非静态成员初始化器,如下所示:
char *input_script_name = nullptr;
int size_input_script_name = 0;
int size_input_script_name_buffer = 0;
char *interpreter_name = nullptr;
int size_interpreter_name = 0;
int size_interpreter_name_buffer = 0;
我不确定当前的编译器是否将其优化为memset
,如果一切都设置为0,但如果您可以访问c++ 11编译器,这是一种方法。
刚刚检查了Clang 3.4,如果一切都设置为0,它会发出memset
。GCC使用寄存器进行初始化,但我怀疑这是因为我的小测试用例只有~10个成员变量。
相关文章:
- 用于访问容器<T>数据成员的正确 API
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 数据成员SFINAE的C++17测试:gcc vs clang
- 派生类是否可以在抽象工厂设计模式中具有数据成员
- 如何在c++中定义以struct为数据成员的类中的构造函数
- 静态数据成员模板专用化的实例化点在哪里
- int数据类型的指针指向的是什么,如果是一个类的私有数据成员,我们创建了该类的两个对象?
- 使用指针访问数组中的对象数据成员
- 友元函数无法访问私有数据成员 (c++)
- 我可以在 C++ 中将数据成员/变量从其定义之外添加到结构中吗?
- 为什么将一个结构的引用设置为等于另一个结构只会更改一个数据成员?
- 将私有数据成员添加到野牛生成的类中
- 输入数据成员未按要求工作
- 二维矢量数据成员
- 在类 A 中创建类型为 B 类的向量 - 访问数据 [C++] [成员在两个类中都是私有的]
- 调用在 HXX 文件中声明的静态数据成员
- 是否可以根据其数据成员的类型确定类型的大小
- 访问数据成员(本身是对象)的数据成员,就好像它们是类成员一样
- 使公共数据成员在C++中无法访问
- 从 XML 中读取未指定结构的每个数据成员