3

如何在 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每次创建实例时都会将其默认初始化为相同的值,但我从未在代码中写入实际值。

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

4

5 回答 5

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 保证),因此上述代码可以不加选择地用于任何类型。

于 2010-04-06T10:55:49.460 回答
4
    int var = int();
    string str = string();
    ...

...或您想要的任何类型名称。

于 2010-04-06T10:55:30.667 回答
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');
}

对于转换运算符来说,这应该是一个相当不错的用法。

于 2010-04-06T11:21:56.727 回答
0

像您的示例一样包装在结构(布尔)中并通过公共成员(布尔::值)访问。它可能不是最优雅的解决方案(为了小利益而有些笨拙),但它与您已经展示的类似。

于 2010-04-06T10:56:50.883 回答
0

如果我理解最初的问题,张贴者说他希望给定类型的变量始终具有相同的初始值,但他不在乎该值是什么,因为他永远不会看它。我对吗?

如果是这样,那么我对海报的问题是:如果您没有初始化变量,它们将具有随机初始值......但您说您从不查看初始值 - 那么它们是随机的为什么重要?

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

于 2010-04-06T11:29:16.433 回答