1

コード:

class B {
public:
    B () : b(++bCounter) {}
    int b;
    static int bCounter;
};

int B::bCounter = 0;

class D : public B {
public:
    D () : d(0) {}
    int d;
};

const int N = 10;
B arrB[N];
D arrD[N];



int sum1 (B* arr) {
    int s = 0;
    for (int i=0; i<N; i++) 
    {
        s+=arr[i].b;
    }
    return s;
}
int sum2 (D* arr) {
    int s = 0;
    for (int i=0; i<N; i++)
    {
        s+=arr[i].b+arr[i].d;
    }
    return s;
}

質問:

これらは何を返しますか:

1)sum1(arrB)=?

2)sum1(arrD)=?

3)sum2(arrD)=?

これらをコンパイルして実行すると、55、65、および155が得られますが、その理由はわかりません。arrBでは変数はb=1,2,3、...、10であり、arrDではb = 11.12、...、20であるため、sum1(arrB)=55と答えることになります。どこでもd=0であるため、11 + 12 + .. + 20の合計のようにsum1(arrD)= 155、およびsum2(arrD)=155。

私は何が間違っているのですか?

4

2 に答える 2

4

オブジェクトのスライスを取得しています。D*配列を受け取る関数に配列を渡しますB*D最初は。よりも大きいですB

実行するたびs+=arr[i].b;に、ポインターをBのサイズで移動しますが、ポインターをDのサイズで移動する必要があるため、各反復の後、ポインターは1つのアイテムを前方に移動しません。

[TheBPart|TheDPart][TheBPart|TheDPart][TheBPart|TheDPart]
^
|
iteration 0

[TheBPart|TheDPart][TheBPart|TheDPart][TheBPart|TheDPart]
         ^
         |
      iteration 1

[TheBPart|TheDPart][TheBPart|TheDPart][TheBPart|TheDPart]
                   ^
                   |
             iteration 2

[TheBPart|TheDPart][TheBPart|TheDPart][TheBPart|TheDPart]
                            ^
                            |
                          iteration 3

あなたの特定のケースで起こることは、それぞれの奇妙な反復の後、それがクラスのオブジェクトの真ん中のどこかを指しているということです。Dこれは、Dがちょうど2倍の大きさBであるためにのみ発生します。そうでない場合、動作は異なります。

于 2012-09-04T08:50:07.387 に答える
2

問題はに変換することarrDにありますarrB。Bのサイズは4バイトで、Dのサイズは8バイトです。

D*をB*に変換している間、実際には8バイトではなく4バイトの反復でメモリにジャンプします。一度に4バイトを取得する場合、arrDは次の値をメモリに保持します

11   // arrD[0].b
0    // arrD[0].d
12   // arrD[1].b
0    // arrD[1].d
13   // arrD[2].b
0    // arrD[2].d
14   // arrD[3].b
0    // arrD[3].d
15   // arrD[4].b
0    // arrD[4].d
16   // arrD[5].b
0    // arrD[5].d
17   // arrD[6].b
0    // arrD[6].d
18   // arrD[7].b
0    // arrD[7].d
19   // arrD[8].b
0    // arrD[8].d
20   // arrD[9].b
0    // arrD[9].d

ここで、一度に4バイトを合計すると、この最初の10個の値を取得します。したがって、結果は次のようになります。11 + 0 + 12 + 0 + 13 + 0 + 14 + 0 + 15 + 0 = 65

同様の推論から、の結果の理由を知ることができますsum2

于 2012-09-04T08:52:41.457 に答える