nullptrとNULLの違い

9091 ワード

nullptrが導入された理由nullptrが導入された理由をNULLから説明します.CとC++プログラマーにとって、NULLに慣れていないに違いない.しかしCとC++のNULLは等価ではない.NULLはポインタがオブジェクトを指さないことを示すが、問題はNULLがキーワードではなくマクロ定義(macro)であることである.NULLはCで定義され、NULLはvoid*ポインタ値0として定義されます.
#define NULL (void*)0  

しかし同時に、NULLをC++における整数0 1.2 NULLの定義として定義することも可能であり、NULLは整数0として明確に定義される.
// lmcons.h   NULL     
#ifndef NULL  
#ifdef __cplusplus  
#define NULL    0  
#else  
#define NULL    ((void *)0)  
#endif  
#endif  

1.3 C++がNULL上で不完全な互換性Cを選択した理由根本的な原因はC++のリロード関数と関係がある.C++はマッチングパラメータのメカニズムを探索することによって最適マッチング(best-match)の関数を見つけようとするが,void*の暗黙型変換をサポートし続けると意味二義性(syntax ambiguous)の問題をもたらす.
//次の2つのリロード関数void foo(int i)を考慮する.void foo(char* p)
foo(NULL);//which is called? 2.nullptrのアプリケーションシーン2.1コンパイラnullptrがサポートされている場合は、nullptrをNULLのマクロ定義の代わりに直接使用する必要があります.正常に使用する過程で彼らは完全に等価です.コンパイラの場合、Visual Studio 2010はnullptrを含むC++0 xのほとんどの特性をサポートし始めました.VS 2010以前のバージョンでは、このキーワードはサポートされていません.Codeblocks10.5付属のG++4.4.1 nullptrはサポートされていません.4.6.1にアップグレードするとnullptrをサポートできます(-std=c++0 xコンパイルオプションが必要です)2.2使用方法0(NULL)とnullptrを交換して使用できます.次の例を示します.

int* p1 = 0;  
int* p2 = nullptr;  
 
if(p1 == 0) {}  
if(p2 == 0) {}  
if(p1 == nullptr) {}  
if(p2 == nullptr) {}  
if(p1 == p2) {}  
if(p2) {}  
   nullptr     ,    :
[cpp] view plain copy

int n1 = 0;             // ok  
int n2 = nullptr;       // error  
 
if(n1 == nullptr) {}    // error  
if(n2 == nullptr) {}    // error  
if(nullprt) {}          // error  
nullptr = 0             // error  
         ,  nullptr ,   char*[cpp] view plain copy

void foo(int)   {cout << "int" << endl;}  
void foo(char*) {cout << "pointer" << endl;}  
 
foo(0);       // calls foo(int)  
foo(nullptr); // calls foo(char*)  
  • シミュレーションnullptrの実装一部のコンパイラはc++11の新しいキーワードnullptrをサポートしていません.nullptrを実装するシミュレーションもできます.
  •  
    const  
    class nullptr_t_t  
    {  
    public:  
        template<class T>           operator T*() const {return 0;}  
        template<class C, class T>  operator T C::*() const { return 0; }  
    private:  
        void operator& () const;  
    } nullptr_t = {};  
    #undef NULL  
    #define NULL nullptr_t