1
#include <iostream>

class Y
{
      public:
             Y();
};

class X
{
      public:
             void foo() {}
             friend Y::Y();

             X()
             {
                    Y::Y();  //Statement 1
             }
};

Y::Y()
{
   std::cout << "Hello";
}

int main()
{
    X a;
    Y::Y();      //Statenent 2
}

上記のプログラムは、HelloHelloDev c++ およびコードパッドで出力を生成します。しかし、Code::Blocks で実行するとエラーが発生しますremove the reduntant Y::

ステートメント 1 と 2 を で置き換えるY();と、プログラムは 3 つすべてで出力を生成します。なぜですか?

4

3 に答える 3

0
If i replace statement 1 and 2 withh Y(); , the program produces the output in all 3. Why so?

出力は、関数を呼び出すことによって生成されますY::Y()。これは、クラス X のインスタンスのコンストラクターで行うか、関数を直接呼び出して行います。

しかし、バリアント「Statement 1」を見てみましょう。コード

int main ()
{
    X a;
}

未使用の変数を作成します。コンパイラはそれを最適化して取り除く可能性があります。その場合、コンストラクターは呼び出されません。これは、コンパイラと使用される実際のオプションに依存します。関数 Y::Y() を直接呼び出すと、最適化して取り除くことができず、常に出力が得られます。

于 2013-08-30T13:05:54.873 に答える