如何在C ++中默认初始化内置类型的局部变量?

时间:2010-04-06 10:50:24

标签: c++ initialization local-variables built-in-types

如何在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将默认初始化为相同的值,但我从不在代码中写入实际值。

如何为局部变量获得相同的行为?

5 个答案:

答案 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)

如果我理解原始问题,海报就是说他希望给定类型的变量总是具有相同的初始值,但他并不关心那个值是什么,因为他永远不会看它。我是对的吗?

如果是这样,那么我对海报的问题就是这样:如果你没有初始化变量,他们会有随机的初始值......但是你说你从不看初始值 - 所以为什么它们很重要随机?

我认为关键问题是 - 你想在这里实现什么目标?