3

C++ でプリミティブ型のローカル変数をデフォルトで初期化するにはどうすればよいですか? たとえば、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ただし、ローカル変数については、何をしようとも、ただ書くだけではうまくいきません。

POD の場合でも、placement-new を使用して「コンストラクター」を呼び出すこともできます。

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 に答える