C++におけるNULLとnullptrの違いとは?
C++プログラミングにおいて、ポインタの無効値を扱う際にNULL
とnullptr
の二つの選択肢があります。これらは似ているようでいて、実は重要な違いがあります。この記事では、NULL
とnullptr
の違いについて詳しく解説し、どの場合にどちらを使用すべきかを説明します。
NULL
NULL
はC言語から継承されたマクロであり、C++では長らく0
または((void*)0)
として定義されてきました。NULL
の主な問題点は、それが整数型としても解釈され得るため、型安全ではないことです。例えば、関数オーバーロードがある場合、NULL
を使用すると意図しないオーバーロードが選択されることがあります。
void func(char* ptr) {
std::cout << "Pointer version called." << std::endl;
}
void func(int i) {
std::cout << "Integer version called." << std::endl;
}
int main() {
func(NULL); // これは"Integer version called."を呼び出します。
}
このコードの意図はポインタバージョンを呼び出すことですが、NULLが0と解釈されるため、整数バージョンが呼ばれてしまいます。
nullptr
C++11で導入されたnullptr
は、上述の問題を解決するための専用のポインタリテラルです。nullptr
はstd::nullptr_t
型を持ち、すべてのポインタ型に安全に変換できますが、整数型には変換できません。これにより、上の例のようなオーバーロードの問題が自然に解消されます。
int main() {
func(nullptr); // これは"Pointer version called."を呼び出します。
}
nullptr
を使用することで、関数func
のポインタバージョンが正しく呼び出されます。
どちらを使うべきか?
モダンC++では、nullptr
の使用が推奨されています。nullptr
はより安全で、意図が明確です。また、C++11以降の新機能やライブラリとの互換性も考慮すると、nullptr
を使うことで多くの潜在的なバグを回避できます。
まとめ
NULL
とnullptr
はどちらもC++でポインタの無効値を表しますが、nullptr
の方が型安全で現代的な解決策を提供します。新しいプロジェクトやC++11以降を使用している場合は、nullptr
を使用することをお勧めします。
Discussion