4

GCC を使用する C++ クラス コンストラクターに問題があります。

以下のクラス「foo」は、AL、AH、AX、EAXなどのプロセッサレジスタをエミュレートすることになっています...そして、このクラスに関連付けられたいくつかの基本的な算術演算が必要です。しかし、初期化または「foo」オブジェクトで奇妙な動作があります。

次の 2 つのケースでは同じ結果が得られません。

フー w = 0x12345678; // ケース 1

ふーw; // ケース 2 初期化 ( 2 ステップ)
    w=0x12345678;

私にとっては、ケース 2 が機能しています。GCC は foo() (コンストラクター 1) を呼び出し、次に = 演算子を呼び出します。最後に、w.m_val は問題ありませんが、ケース 1 の場合、GCC は直接 foo( long *) (コンストラクター 2) を呼び出し、他には何もしません。明らかに、それは私が期待しているものではありません。

char 、int、または long が "foo" の場合、どちらの場合も結果は同じになります。

コンストラクターについて何か誤解したか、何か間違ったことをしたのかもしれません。誰か助けてくれませんか?

ありがとう。

クラスフー
{
    公衆:
        foo(){ // コンストラクター 1
          m_val=0;
          m_ptr=NULL;
          };

        foo(long *p){ // コンストラクター 2、絶対に呼び出さないでください!!!
          m_val=0;
          m_ptr=p;
        };
        friend foo operator+( const foo &rhs, const unsigned int v );

        foo &operator+= (unsigned int v )
        {
            m_val+=v;
            *これを返します。
        }

        ~foo(){};

         foo &operator= ( const foo &rhs )
         {
            m_val=rhs.m_val;
            *これを返します。
         };
         foo &operator= ( const unsigned int v )
         {
            m_val=v;
            *これを返します。
         };

    プライベート:
        unsigned int m_val;
        長い *m_ptr;
};

4

1 に答える 1

3

コンストラクターについて何か誤解しています。外観にもかかわらずfoo w=0x12345678;、代入演算子への呼び出しは含まれていません。これはcopy-initializationであり、(ほとんど) 以下と同等です。

foo w{foo{0x12345678}};

パラメータfooを取るコンストラクタがないため、これはコンパイルされません。int

私が「ほとんど」と言ったのは、 からへ(または のサブクラス)へfoo w=0x12345678;の暗黙的な変換が必要であり、明示的な変換が必要であり、 のサブクラスを構築することは決してないためです。intfoofoofoo w{foo{0x12345678}};foo

于 2012-11-17T09:38:26.383 に答える