【C++学習|初心者向け】C++初心者必見!なぜ今「NULL」を使ってはいけないのか?nullptrへの乗り換えガイド

1. 導入:なぜNULLは使わなくなったのか?

C言語からプログラミングを始めた方にとって、ポインタを初期化する際にNULLを書くのは当たり前の習慣かもしれません。しかし、現代のC++開発においてNULLの使用は推奨されていません。なぜなら、NULLには「型が曖昧である」という重大な欠点があるからです。このTipsでは、NULLの正体と、なぜC++ではnullptrを使うべきなのかを解説します。

2. 基礎知識:NULLとnullptrの違い

多くの環境で、NULLは以下のように定義されています。
define NULL 0
つまり、NULLの実体は「整数値の0」です。これには問題があります。例えば、関数が「整数を受け取る場合」と「ポインタを受け取る場合」のオーバーロードがあるとき、コンパイラはNULLをどちらとして解釈すべきか迷ってしまうことがあります。

一方で、C++11から導入されたnullptrは「ヌルポインタ専用の型(std::nullptr_t)」を持っています。これにより、ポインタとしてのみ機能することが保証され、予期せぬバグを防ぐことができるのです。

3. 実装/解決策:nullptrへの移行手順

やることは非常にシンプルです。これまでNULLと書いていた場所をすべてnullptrに書き換えるだけです。これにより、コードの安全性と読みやすさが劇的に向上します。

4. サンプルプログラム

以下のコードをコピーして、実際にコンパイルして動作を確認してみてください。

/ nullptrの使用例 /
include

void check(int p) {
std::cout << "ポインタが渡されました。" << std::endl; } void check(int n) { std::cout << "整数が渡されました。" << std::endl; } int main() { // NULLを使うと、コンパイラが整数0とポインタのどちらか判断に迷う場合がある // int ptr = NULL; // 非推奨 // nullptrを使うと、明確にポインタであることが伝わる int ptr = nullptr; if (ptr == nullptr) { std::cout << "ptrは現在空です。" << std::endl; } // 関数のオーバーロードでも正しくポインタ版が呼び出される check(nullptr); return 0; }

5. 応用・注意点:現場での運用

現場の開発では、古いライブラリと連携する際にNULLが混ざっていることがありますが、これから書くコードは迷わずnullptrを選択してください。

また、注意点として「nullptrはC++11以降の機能」であるという点です。もし非常に古い環境(C++98以前)で開発している場合はnullptrが使えませんが、現在の主流な開発現場ではC++11以降が標準ですので、積極的に導入しましょう。安全なコードを書くための第一歩として、まずは「NULLを禁止する」というルールを自分の中で決めてみてください。

コメント

タイトルとURLをコピーしました