1

重複の可能性:
NULL ポインターでのクラス メンバーへのアクセス

非常にばかげた質問、または私の概念的な疑問かもしれません。

    #include <iostream>

    using namespace std;

    class A
    {
            public:
            void print()
            {
                    cout<<"Printing\n";
            }
    };

    int main()
    {
            A * a = NULL;
            a->print();
            return 0;
    }

出力は次のとおりです。

aクラスAのメンバー関数にアクセスできるポインター(NULL)はどうですか.

説明してください...ばかげた質問かもしれませんが、NULLポインターはクラスのメンバー関数にアクセスできないという印象を受けました。

4

3 に答える 3

6

コードで行っているように、ポインターを逆参照するNULLことは、未定義の動作です。このような未定義の可能性の 1 つは、それが機能する可能性があることです。しかし、次回はクラッシュするか、まったく予期しないことが起こる可能性があります。

thisメンバー関数で暗黙の引数を使用していないため、そのprintようなNULLポインターを実際に逆参照する必要はないようです。

于 2012-06-05T21:06:25.650 に答える
5

逆参照NULLすると、未定義の動作(UB) が発生します。UB は、「クラッシュしなければならない」または「変なことをしなければならない」という意味ではありません。

于 2012-06-05T21:06:24.787 に答える
2

述べたように、はい、これは未定義の動作ですが、機能する理由は...

これはnullポインターですが、定義された型「A」のままです。クラスのインスタンスを作成するたびに、メソッドが複製されず、ramが割り当てられ、新しく割り当てられたアドレスでコンストラクターメソッドが呼び出されます。

あなたのメソッドがクラスの内部構造を使用しない限り、メソッドの呼び出しは引き続き機能しますが、そのような機能が必要な場合は、代わりに静的メソッドを使用する必要があります。 ' またはクラスの内部メンバーのいずれか。

メソッド内でブレークして「this」の値を調べると、NULL であることがわかります。

于 2012-06-05T21:15:38.770 に答える