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の使用が推奨されています。これについては後述します。