NULLとは何か
C++では、ポインタが何も指していない状態を表すためにNULL
が使われます。NULL
は、実際には整数型のゼロを表し、ポインタ型にキャストされたものです。つまり、NULL
はアドレスを持たず、何も指していないことを示します。
以下に、NULL
の使用例を示します。
int* ptr = NULL;
このコードでは、ptr
という名前の整数型のポインタを宣言し、NULL
で初期化しています。これにより、ptr
は何も指していない状態となります。
しかし、C++11以降ではNULL
の代わりにnullptr
が推奨されています。これについては後述します。
nullptrとは何か
C++11以降、NULL
の代わりにnullptr
が導入されました。nullptr
は、リテラルであり、どのポインタ型にも変換できる特殊なキーワードです。nullptr
は、型安全を提供し、NULL
が持ついくつかの問題を解決します。
以下に、nullptr
の使用例を示します。
int* ptr = nullptr;
このコードでは、ptr
という名前の整数型のポインタを宣言し、nullptr
で初期化しています。これにより、ptr
は何も指していない状態となります。
nullptr
は、NULL
と比べて型安全であるため、C++11以降ではnullptr
の使用が推奨されています。これについては後述します。
NULLとnullptrの違い
C++では、NULL
とnullptr
はどちらもポインタが何も指していない状態を表すために使用されます。しかし、これら二つには重要な違いがあります。
-
型:
NULL
は整数型のゼロを表し、ポインタ型にキャストされたものです。一方、nullptr
はリテラルであり、どのポインタ型にも変換できる特殊なキーワードです。 -
型安全:
nullptr
は型安全を提供します。つまり、nullptr
はポインタ型にのみ変換され、整数型には変換されません。これに対して、NULL
は整数型であるため、予期しない挙動を引き起こす可能性があります。 -
C++のバージョン:
NULL
はC++の初期バージョンから存在しています。一方、nullptr
はC++11以降で導入されました。
以下に、NULL
とnullptr
の違いを示すコード例を示します。
void func(int);
void func(int*);
func(NULL); // Ambiguous: NULL can be both int and int*
func(nullptr); // Unambiguous: nullptr can only be int*
このコードでは、NULL
を引数に取るfunc
の呼び出しは曖昧です。なぜなら、NULL
はint
とint*
の両方に変換できるからです。一方、nullptr
を引数に取るfunc
の呼び出しは曖昧ではありません。なぜなら、nullptr
はint*
にしか変換できないからです。
したがって、C++11以降ではnullptr
の使用が推奨されています。これについては後述します。
C++11でのnullptrの導入
C++11では、NULL
の代わりにnullptr
が導入されました。nullptr
は、どのポインタ型にも変換できる特殊なキーワードで、リテラルです。これにより、C++のコードはより型安全になりました。
NULL
は整数型のゼロを表し、ポインタ型にキャストされたものです。そのため、NULL
は整数型とポインタ型の両方に変換でき、これが問題を引き起こす可能性がありました。例えば、関数のオーバーロードがある場合、NULL
を引数に取る関数の呼び出しは曖昧になる可能性があります。
一方、nullptr
はポインタ型にのみ変換され、整数型には変換されません。これにより、nullptr
を引数に取る関数の呼び出しは曖昧ではなくなります。
以下に、C++11でのnullptr
の導入による改善を示すコード例を示します。
void func(int);
void func(int*);
func(NULL); // 曖昧: NULLはintとint*の両方になる可能性がある
func(nullptr); // 曖昧ではない: nullptrはint*にしかならない
このコードでは、NULL
を引数に取るfunc
の呼び出しは曖昧です。なぜなら、NULL
はint
とint*
の両方に変換できるからです。一方、nullptr
を引数に取るfunc
の呼び出しは曖昧ではありません。なぜなら、nullptr
はint*
にしか変換できないからです。
したがって、C++11以降ではnullptr
の使用が推奨されています。これについては後述します。
NULLとnullptrの使用例
C++では、NULL
とnullptr
はどちらもポインタが何も指していない状態を表すために使用されます。以下に、それぞれの使用例を示します。
NULLの使用例
int* ptr = NULL;
このコードでは、ptr
という名前の整数型のポインタを宣言し、NULL
で初期化しています。これにより、ptr
は何も指していない状態となります。
nullptrの使用例
int* ptr = nullptr;
このコードでは、ptr
という名前の整数型のポインタを宣言し、nullptr
で初期化しています。これにより、ptr
は何も指していない状態となります。
nullptr
は、NULL
と比べて型安全であるため、C++11以降ではnullptr
の使用が推奨されています。これについては後述します。