2012-02-10 20 views
2

ポインタの初期化について多くの質問がありましたが、私は最近気になるもののための答えを見つけることができませんでした。なぜgccで動作するのですか?ポインタの初期化

class C { 
}; 

/* other stuff here */ 

typedef C* pTypeC; 
C* pOtherTypeC = pTypeC(0); 

typedefに "(0)"を使用してポインタをNULLで初期化することは有効ですか?

+0

私は確信していません(これはコメントであり、答えではありません)、私はそれが 'C * pOtherTypeC =(pTypeC)(0);'と解釈されると思います。 C *)(0); 'キャストであなたを残しなさい。 – Nobody

+0

C++ 11では、とにかく 'NULL'ではなく' nullptr'を使用することができます/使用する必要があります – Flexo

+0

@awoodland:なぜでしょうか?必ずしも。これらの余分な型の安全チェックを気にしない場合は、0だけを使用することもできます。 –

答えて

3

問題は、pTypeC(0)がキャスト操作と見なされることです。

C* pOtherTypeC = (pTypeC) (0); 

希望します。

+0

それは誰も言及していない良い点です – BlackBear

+0

なぜそれは "問題"ですか? – ildjarn

0

0に初期化されたC*C*に初期化しています。完全に合法ですが、どちらも同じことをしますが、C* blah = nullptrを好むべきです。

0

NULLの値は、いくつかの異なる方法で定義できます。場合によっては、0という値をポインタに割り当てることもできます。この時点では、整数からポインタ型への暗黙的な変換があります。それ以外のポインタ型に変換できるように、(void*)0などのキャストで定義されます。それを明示的に非ポインタ型に割り当てるべきではありません。また、C++ 11では、NULL値を持つポインタを初期化するために使用できる特定のグローバルnullptrオブジェクトがあります。

しかし、一般的には、ポインタを初期化する方法が混乱し、推奨されるコーディング方法ではありません。明示的にnullptrまたはNULLのいずれかをポインタに割り当て、NULLを選択した場合は、他のヘッダーファイルが含まれていない場合はコンパイルエラーが発生しないように<cstddef>を必ず含めてください。

0

あなたがやっていることはオブジェクトの初期化ではなく、新しいメモリを割り当てたり、新しいオブジェクトを作成したりしていません。NULL(これは整数値0に等しい)にポインタを割り当てています。 。

後方の作業:

C* pOtherTypeC = pTypeC(0); 
C* pOtherTypeC = pTypeC(NULL); 
C* pOtherTypeC = C*(NULL); 
C* pOtherTypeC = (C*) NULL; 
C* pOtherTypeC = NULL; 

をすべての5行は、機能的に同等であり、同じ結果を生成します。

+0

実際、彼はnullへのポインタを初期化しています。 – ildjarn

+0

初期化はクラス '(C *)'オブジェクトを参照しています...私の返信は1mほど遅れていました。 – utopianheaven

関連する問題