NULLについて

NULLとは

NULLとはC++のプログラミング上でさまざまな意味を持たされています。

しかしJavaのnullとは違い、 C++のNULLはC++のキーワードではなく単なるマクロ定義です。

NULLの欠点

NULLはマクロ定義なので、処理系によって定義がばらばらです。 よってNULLの意味は他の実装系では違う意味になり、 思ったとおりの動作をしない可能性があります。

NULLの代用

そもそもNULLはC言語との互換性のために残されているマクロ定義であり、 C++では不必要な存在なのです。

C++で(C言語で言う)NULLを表現したい場合、 0を使用します。 0は任意の型のヌルポインタに変換される事が保証されているので、 どんなNULLマクロよりも安全です。

0の問題

0を使用する方法にもひとつだけ欠点があります。

それは、0は任意の型のヌルポインタに変換できますが、 整数型でもあります。 なので、クラス型を引数にもち、ヌルポインタも引数として許す関数と 整数型を引数に取る関数を同時に定義すると、 ヌルを渡した際に常に整数型を引数に取る関数が呼び出されることになります。

これはC++自体の欠陥のひとつでしょう。 これを解決するのは面倒で複雑な方法を使用しないといけないので、 このような関数の多重定義は行わないようにしましょう。

先端技術応用null

ここで紹介するのはこれまで挙げた欠点が全くない、先端技術応用nullです。

これはEffective C++に掲載されている手法です。

const class {
public:
    template<class T>
    operator T*() const { return 0; }
    // あらゆる型のメンバポインタへの変換
    template<class C, class T>
    operator T C::*() const  { return 0; }
private:
    void operator&() const;
} null; 

この先端技術応用nullには1つだけ欠点が存在します。

それは、このnullが使ってもらえるかどうかわからないことです。

今までどおりのNULLの定義や、推奨されている0の使用を防ぐことは出来ません。