如何在C ++中默认初始化基本类型的局部变量?例如,如果a有一个typedef:
typedef unsigned char boolean;//that's Microsoft RPC runtime typedef
我想更改以下行:
boolean variable = 0; //initialize to some value to ensure reproduceable behavior
retrieveValue( &variable ); // do actual job
进入自动默认初始化变量的东西 - 我不需要为它分配一个特定的值,而是每次程序运行时我只需要将它初始化为相同的值 - 与我可以使用构造函数初始化列表:
struct Struct {
int Value;
Struct() : Value() {}
};
并且每次构造一个实例时,Struct::Value
将默认初始化为相同的值,但我从不在代码中写入实际值。
如何为局部变量获得相同的行为?
答案 0 :(得分:5)
您可以通过以下方式模仿该行为:
boolean x = boolean();
或者,更一般地说,
T x = T();
如果存在这样的默认初始化,这将默认初始化x
。但是,无论你做什么,只写T x
永远不会为局部变量做诀窍。
您也可以使用placement-new来调用“构造函数”,即使对于POD:
T x;
new (&x) T();
请注意,此代码会为非POD类型生成未定义的行为(特别是对于具有非平凡析构函数的类型)。要使此代码适用于用户定义的类型,我们首先需要调用对象的析构函数:
T x;
x.~T();
new (&x) T();
此语法也可用于POD(由§§5.2.4/ 12.4.15保证),因此上述代码可以不加选择地用于任何类型。
答案 1 :(得分:4)
int var = int();
string str = string();
...
...或您想要的任何类型名称。
答案 2 :(得分:1)
您可以通过重载转换运算符提供一个表示基础类型的包装器。
#include <cassert>
template <class T>
class Type
{
T t;
public:
Type(const T& t = T()): t(t) {}
operator T&() { return t; }
operator const T&() const { return t; }
};
int main()
{
Type<unsigned char> some_value;
assert(some_value == '\0');
}
对于转换运算符来说,这应该是一个相当不错的用法。
答案 3 :(得分:0)
在示例中包装struct(Boolean)并通过public成员访问(Boolean :: value)。它可能不是最优雅的解决方案(一些小的利益),但它与你已经展示的类似。
答案 4 :(得分:0)
如果我理解原始问题,海报就是说他希望给定类型的变量总是具有相同的初始值,但他并不关心那个值是什么,因为他永远不会看它。我是对的吗?
如果是这样,那么我对海报的问题就是这样:如果你没有初始化变量,他们会有随机的初始值......但是你说你从不看初始值 - 所以为什么它们很重要随机?
我认为关键问题是 - 你想在这里实现什么目标?