導入の1 nullptr要。
典型的なポインタがヌルの位置を指すように初期化されます。例えば:
int型* my_ptr = 0;
int型* my_ptr = NULL;
一般に、NULLは、マクロ定義です。
#undefを NULL の#if定義された(__ CPLUSPLUS) の#define NULL 0 の#else の#define NULL((void *型)0) #endifの
NULLリテラルは0として、または定義された型なしポインタ(ボイド*)定数として定義することができます。
コードは、NULLの使用による予期せぬ動作を示しています。
する#include <stdio.hの> ボイド F(CHAR * C){ のprintf(" 呼び出しF(チャー*)\ n " ); } ボイド F(int型I){ のprintf(" F(INT)\ Nを呼び出します" )。 } int型のmain(){ F(0 )。 F(NULL)。 F((チャー *)0 )。リターン0 ; }
出力は次のようになります。
F(int)を呼び出します
F(INT)// NULL定義0リテラルタイプのいずれかのプラスチックであってもよく、あるいは非ポインタ型(ボイド*)であってもよい、0を引き起こし起動
Fを呼び出す(チャー*)
2.nullptr定義:
decltype(nullptr)nullptr_tのtypedef。
のnullptr上の共通のルール:
(1)すべてのデータ型が等価であるnullptr_tの定義は、動作は全く同じです。
(2)データのnullptr_tタイプは、暗黙的に任意の型のポインタに変換することができます。
(3)データのnullptr_t型は非ポインタ型に変換することができない、reinterpret_castは場合でも<nullptr_t>()途中でできません。
(4)nullptr_t型データは、算術式では使用できません
(5)データのnullptr_tタイプは、リレーショナル演算式に使用されるが、唯一nullptr_t型データまたはポインタデータ型と比較することができます。
#include <iostreamの> する#include <のTypeInfo> 使用して 名前空間STD; int型のmain(){ チャー *のCP = nullptr; //は整数に変換できない // INT N1 = nullptr; // INT reinterpret_castはN2 = <整数>( nullptr A); // nullptr比較は、タイプnullptr_tを用いて作製することができる にnullptr_tのnptrの、 IF(== nptrのがするnullptr A){ COUT << " ==をnullptrするnullptr_t nptrの" << ENDL; } 他{ COUT << " != nullptr nullptr_tするnptrの" <<ENDL; } IF(nptrのに< nullptr A){ COUT << " nullptr_t nptrのに<nullptr " << ENDL; } 他{ COUT << " nullptr_t nptrのに<nullptr!" << ENDL; } // ブール型に変換することができない // (nullptr == 0)IF // IF(nullptr A) // 行わない算術 // nullptr A + = 1; // *をnullptr 5 // 以下正常に動作 はsizeof (nullptr a)は、 型ID(nullptr A)、 スロー( nullptr); リターン 0 ; }
3.ルールを議論します
C ++ 11標準、同じ空で占められnullptr型のデータメモリ空間*。
sizeof(nullptr_t)==はsizeof(void *型)
nullptrは、その名のキーワードコンパイル時でコンパイル時定数であり、コンパイラによって認識することができます。