const class nullptr_t { public: template<class T> inline operator T*() const { return 0; } template<class C, class T> inline operator T C::*() const { return 0; } private: void operator&() const; } nullptr = {};
来自维基的代码,但是看不懂,求大佬解释。
认证0级讲师
あなたの説明に基づいて、デモのために vs2013 で次のコードを書きました。
結果の出力T* が呼び出されますT C::* が呼び出されます000000000
説明: 最初にクラスを宣言し (競合を避けるために、mynullptr_t を使用しました)、const 変更を使用します。これは、内部の変数は変更できないことを意味します。 同時に、クラスには 2 つのパブリック関数があります
ここで、template はテンプレートを意味し、T がユーザー定義型を作成できることを意味します。これは null ポインターであるため、多くの種類のポインターがそれを指すことができるため、テンプレートが使用されます。演算子キーワードが使用されているため、この関数は暗黙的な変換関数です。 const は、この関数がクラスのメンバー変数を変更しないことを意味します。この点についてよくわからない場合は、次の 2 つのブログを参照してください。1. C++ テンプレートの詳細な説明と 2. C++ 演算子の 2 つの使用法。 この関数は 0 を返すという 1 つのことだけを行います。なぜ 0 を返すのでしょうか?ポインターに値を代入するときに、ポインター = 0 の場合、ポインターは NULL ポインターであることを意味するためです。その理由は、<stdio.h> ヘッダー ファイルの下に次の定義があるためです。 リーリー NULL を 0 として定義します。
リーリー 出力:00000000
2 番目の関数は、テンプレートが異なることを除いて上記と同じです
目的は、クラスのメンバー ポインター変数に null ポインターを割り当てることです。したがって、独自のニーズに応じてさまざまなテンプレート パラメータを記述することができます。
メイン関数でいくつかの変数を定義しました リーリー int * のポインタ p には null ポインタが代入され、クラス A のメンバ ポインタには null ポインタが代入されます。
。同じ 2 番目の変換関数は、 を出力する 2 番目の暗黙的な変換関数を呼び出す必要があります。 NULL ポインタのアドレスはアドレス 0 であることがわかっているため、最初のポインタは 00000000 を出力します (32 ビット システム ポインタは 4 バイトを占有するため、0 が 8 つあります)。 2 番目のものはメンバー ポインターであるためオフセットを表し、null ポインターであるため 0 になります。 T* is called
T* is called
あなたの説明に基づいて、デモのために vs2013 で次のコードを書きました。
リーリー結果の出力
T* が呼び出されます
T C::* が呼び出されます
00000000
0
説明:
リーリー最初にクラスを宣言し (競合を避けるために、mynullptr_t を使用しました)、const 変更を使用します。これは、内部の変数は変更できないことを意味します。
同時に、クラスには 2 つのパブリック関数があります
ここで、template はテンプレートを意味し、T がユーザー定義型を作成できることを意味します。これは null ポインターであるため、多くの種類のポインターがそれを指すことができるため、テンプレートが使用されます。演算子キーワードが使用されているため、この関数は暗黙的な変換関数です。 const は、この関数がクラスのメンバー変数を変更しないことを意味します。この点についてよくわからない場合は、次の 2 つのブログを参照してください。1. C++ テンプレートの詳細な説明と 2. C++ 演算子の 2 つの使用法。
信じられない場合は、試してみてくださいこの関数は 0 を返すという 1 つのことだけを行います。なぜ 0 を返すのでしょうか?ポインターに値を代入するときに、ポインター = 0 の場合、ポインターは NULL ポインターであることを意味するためです。その理由は、<stdio.h> ヘッダー ファイルの下に次の定義があるためです。 リーリー
NULL を 0 として定義します。
リーリー
出力:00000000
2 番目の関数は、テンプレートが異なることを除いて上記と同じです
リーリー目的は、クラスのメンバー ポインター変数に null ポインターを割り当てることです。したがって、独自のニーズに応じてさまざまなテンプレート パラメータを記述することができます。
void 演算子&() const; プライベートでは、& 記号を無効にすることを意味します。メイン関数でいくつかの変数を定義しました
左側の値にはMynullptrが代入されているので、この時暗黙的な型変換が必要になります。クラスで作成した 2 つの関数を覚えていますか? これらは暗黙的な変換関数です。左側の型に従ってテンプレートを照合します。もちろん、最初のものは T* に一致するため、最初の暗黙的な変換関数が呼び出され、結果が出力されますリーリー
int * のポインタ p には null ポインタが代入され、クラス A のメンバ ポインタには null ポインタが代入されます。
。同じ 2 番目の変換関数は、
を出力する 2 番目の暗黙的な変換関数を呼び出す必要があります。 NULL ポインタのアドレスはアドレス 0 であることがわかっているため、最初のポインタは 00000000 を出力します (32 ビット システム ポインタは 4 バイトを占有するため、0 が 8 つあります)。 2 番目のものはメンバー ポインターであるためオフセットを表し、null ポインターであるため 0 になります。
T* is called