0

VisualStudio2008でコンパイルしている次のC/C++コードがあります。

struct TEST_STRUCT{
    int nV;
    float v;

    TEST_STRUCT()
    {
        nV = 0;
        v = 0.0;
    }
};

TEST_STRUCT v1;
v1.nV = 100;
v1.v = 2.0;

const TEST_STRUCT v2;               //Making it 'const' to prevent any further changes
(TEST_STRUCT)v2 = v1;

int a = v2.nV;                      //'a' is 0, why???

なぜこんなに奇妙な結果が出るのですか?

4

2 に答える 2

3

あなたは非常に厄介なことをしました:あなたはあなたのconst修飾子を捨てました。

const TEST_STRUCT v2 = v1;

また

const TEST_STRUCT v2(v1);

あなたが望むものをあなたに与えるでしょう...あなたが非常に、非常に悪いconst修飾子に違反することを決心しない限り。

于 2012-09-15T22:50:51.747 に答える
1

指摘されたように、割り当てようとしたオブジェクトは一時的なオブジェクトですが、元のオブジェクトは変更されていません。これは、コンパイラが文句を言わなかった理由の 1 つです。実際のオブジェクトをキャストしたい場合は、次のようなものを使用します。

const_cast<TEST_STRUCT&>(v2) = v1;

このキャストは、オブジェクトとして存続期間を開始したオブジェクトに適用されると未定義の動作を引き起こすため、これは必ずしも機能しませんconst。オブジェクトが読み取り専用メモリに存在するか、コンパイラがそのメンバーへのアクセスを対応するものに置き換える可能性があります。初期値。

constオブジェクトのメンバーを設定する唯一の方法は、構築中です。2 つのコンストラクターがstructあると便利です。宣言した既定のコンストラクターと、宣言されているかサブオブジェクト (非静的メンバーまたは基本クラス) の 1 つにコピー コンストラクターがない場合を除き、コンパイラが作成するコピー コンストラクターです。したがって、次のように記述します。

TEST_STRUCT const v2(v1);

また

TEST_STRUCT const v2 = v1;

この場合、両方の呼び出しは意味的に同等ですが、後者の呼び出しには理論的には 2 つのコピーが含まれます。の型が異なる場合v1、2 つの呼び出しはわずかに異なり、後者の呼び出しは最初に変換してからコピーします。コピーは通常省略されますが、それでもコピー コンストラクターが必要です。

于 2012-09-15T23:28:17.223 に答える