📘

C++におけるNULLとnullptrの違いとは?

2024/08/02に公開

C++プログラミングにおいて、ポインタの無効値を扱う際にNULLnullptrの二つの選択肢があります。これらは似ているようでいて、実は重要な違いがあります。この記事では、NULLnullptrの違いについて詳しく解説し、どの場合にどちらを使用すべきかを説明します。

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は、上述の問題を解決するための専用のポインタリテラルです。nullptrstd::nullptr_t型を持ち、すべてのポインタ型に安全に変換できますが、整数型には変換できません。これにより、上の例のようなオーバーロードの問題が自然に解消されます。

int main() {
    func(nullptr);  // これは"Pointer version called."を呼び出します。
}

nullptrを使用することで、関数funcのポインタバージョンが正しく呼び出されます。

どちらを使うべきか?

モダンC++では、nullptrの使用が推奨されています。nullptrはより安全で、意図が明確です。また、C++11以降の新機能やライブラリとの互換性も考慮すると、nullptrを使うことで多くの潜在的なバグを回避できます。

まとめ

NULLnullptrはどちらもC++でポインタの無効値を表しますが、nullptrの方が型安全で現代的な解決策を提供します。新しいプロジェクトやC++11以降を使用している場合は、nullptrを使用することをお勧めします。

Discussion