27

最近、次のプログラムを試してみましたが、コンパイルされ、正常に実行され、実行時エラーの代わりに期待される出力が生成されます。

#include <iostream>
class demo
{
    public:
        static void fun()
        {
            std::cout<<"fun() is called\n";
        }
        static int a;
};
int demo::a=9;
int main()
{
    demo* d=nullptr;
    d->fun();
    std::cout<<d->a;
    return 0;
}

初期化されていないポインターを使用してクラスおよび/または構造体メンバーにアクセスする場合の動作は未定義ですが、null ポインターを使用して静的メンバーにアクセスできるのはなぜですか。私のプログラムに害はありますか?

4

5 に答える 5

0

ここに表示されているのは、C++ 言語および同じ一般的なプログラミング言語ファミリーに属する他の多くの言語の仕様における、考えが浅く不幸な設計上の選択であると私が考えるものです。

これらの言語では、クラスのインスタンスへの参照を使用して、クラスの静的メンバーを参照できます。静的メンバーにアクセスするためにインスタンスは必要ないため、インスタンス参照の実際の値はもちろん無視されます。

そのd->fun();ため、コンパイラでは、コンパイル中にのみdポインターを使用して、クラスのメンバーを参照していることを認識し、それを無視します。ポインターを逆参照するコードはコンパイラーによって発行されないため、実行時に NULL になるという事実は問題になりません。demo

したがって、起こっていることは言語の仕様に完全に準拠しています。私の意見では、仕様はこの点で問題があります。インスタンス参照を使用して静的メンバーを参照するという非論理的なことが起こる可能性があるからです。

PSほとんどの言語のほとんどのコンパイラは、実際にはそのようなものに対して警告を発することができます。私はあなたのコンパイラについて知りませんが、あなたが行ったことに対して警告を受け取らなかったという事実は、あなたが十分な警告を有効にしていないことを意味するかもしれないので、チェックしたいと思うかもしれません.

于 2015-02-12T16:49:25.387 に答える