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を禁止する」というルールを自分の中で決めてみてください。

コメント