ポインタの初期化について多くの質問がありましたが、私は最近気になるもののための答えを見つけることができませんでした。なぜgccで動作するのですか?ポインタの初期化
class C {
};
/* other stuff here */
typedef C* pTypeC;
C* pOtherTypeC = pTypeC(0);
typedefに "(0)"を使用してポインタをNULLで初期化することは有効ですか?
ポインタの初期化について多くの質問がありましたが、私は最近気になるもののための答えを見つけることができませんでした。なぜgccで動作するのですか?ポインタの初期化
class C {
};
/* other stuff here */
typedef C* pTypeC;
C* pOtherTypeC = pTypeC(0);
typedefに "(0)"を使用してポインタをNULLで初期化することは有効ですか?
0
に初期化されたC*
をC*
に初期化しています。完全に合法ですが、どちらも同じことをしますが、C* blah = nullptr
を好むべきです。
NULL
の値は、いくつかの異なる方法で定義できます。場合によっては、0
という値をポインタに割り当てることもできます。この時点では、整数からポインタ型への暗黙的な変換があります。それ以外のポインタ型に変換できるように、(void*)0
などのキャストで定義されます。それを明示的に非ポインタ型に割り当てるべきではありません。また、C++ 11では、NULL値を持つポインタを初期化するために使用できる特定のグローバルnullptr
オブジェクトがあります。
しかし、一般的には、ポインタを初期化する方法が混乱し、推奨されるコーディング方法ではありません。明示的にnullptr
またはNULL
のいずれかをポインタに割り当て、NULL
を選択した場合は、他のヘッダーファイルが含まれていない場合はコンパイルエラーが発生しないように<cstddef>
を必ず含めてください。
あなたがやっていることはオブジェクトの初期化ではなく、新しいメモリを割り当てたり、新しいオブジェクトを作成したりしていません。NULL
(これは整数値0
に等しい)にポインタを割り当てています。 。
後方の作業:
C* pOtherTypeC = pTypeC(0);
C* pOtherTypeC = pTypeC(NULL);
C* pOtherTypeC = C*(NULL);
C* pOtherTypeC = (C*) NULL;
C* pOtherTypeC = NULL;
をすべての5行は、機能的に同等であり、同じ結果を生成します。
実際、彼はnullへのポインタを初期化しています。 – ildjarn
初期化はクラス '(C *)'オブジェクトを参照しています...私の返信は1mほど遅れていました。 – utopianheaven
私は確信していません(これはコメントであり、答えではありません)、私はそれが 'C * pOtherTypeC =(pTypeC)(0);'と解釈されると思います。 C *)(0); 'キャストであなたを残しなさい。 – Nobody
C++ 11では、とにかく 'NULL'ではなく' nullptr'を使用することができます/使用する必要があります – Flexo
@awoodland:なぜでしょうか?必ずしも。これらの余分な型の安全チェックを気にしない場合は、0だけを使用することもできます。 –