c++ - 自己实现一个nullptr
PHP中文网
PHP中文网 2017-04-17 15:36:51
0
1
423
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 = {};

来自维基的代码,但是看不懂,求大佬解释。

PHP中文网
PHP中文网

认证0级讲师

全員に返信(1)
巴扎黑

あなたの説明に基づいて、デモのために 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; プライベートでは、& 記号を無効にすることを意味します。

メイン関数でいくつかの変数を定義しました
リーリー
int * のポインタ p には null ポインタが代入され、クラス A のメンバ ポインタには null ポインタが代入されます。

左側の値にはMynullptrが代入されているので、この時暗黙的な型変換が必要になります。クラスで作成した 2 つの関数を覚えていますか? これらは暗黙的な変換関数です。左側の型に従ってテンプレートを照合します。もちろん、最初のものは T* に一致するため、最初の暗黙的な変換関数が呼び出され、結果が出力されます

。同じ 2 番目の変換関数は、
を出力する 2 番目の暗黙的な変換関数を呼び出す必要があります。 NULL ポインタのアドレスはアドレス 0 であることがわかっているため、最初のポインタは 00000000 を出力します (32 ビット システム ポインタは 4 バイトを占有するため、0 が 8 つあります)。 2 番目のものはメンバー ポインターであるためオフセットを表し、null ポインターであるため 0 になります。 T* is called

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート