2

この質問が既にされている場合は申し訳ありませんが、同じ質問が見つかりませんでした。関連する質問にリダイレクトしてください。

#include<iostream>

using namespace std;

class ABC
{
    int a;
    int &ref;
public:    
    ABC(int arg = 0):a(arg), ref(a){}
    void mutate_func(int arg) const {
        ref = arg;
    }
    void print_val() {
        cout << endl << &a << "\t" << &ref;
        cout << endl << a << "\t" << ref;
    }
};

int main()
{
    ABC abc_obj(5);
    cout << sizeof(abc_obj);

    abc_obj.print_val();
    abc_obj.mutate_func(10);
    abc_obj.print_val();
    return 0;
}

同じクラスのみの一部である参照変数を使用して、const メンバー関数内のクラスのデータ メンバーを変更しようとしています。

2 つの質問があります -

  1. コンパイルエラーがスローされない理由。

  2. 両方の変数のアドレスを出力していますが、予想どおり両方が同じアドレスを示していますが、インスタンスの sizeof() はサイズを 8 バイトとして表示しています。

4

2 に答える 2

2
  1. コンパイラは、コンパイル時に参照先を完全に追跡することはできません。
  2. 参照が参照する場所に保存する必要があるためです。

これは、未定義の動作をトリガーするのを非常に簡単にするクラスです。その const オブジェクトを作成し、const メンバー関数を呼び出すだけです。

C++ はmutable、const メンバー関数内のオブジェクトのビットを変更するサポートされているメカニズムのキーワードをサポートしています。

于 2012-10-18T08:08:52.797 に答える
1

sizeofとaddressの部分はお答えできます。

参照は、より軽い構文のポインターのように見えるため、ポインターと同等の記憶域 (ここでは 4 バイト) が必要です。

参照は、その初期化中にのみ変更されますref(a)。初期化後、参照に対するすべての操作は参照される値に対して実行されるため&ref、参照自体ではなく、参照される値のアドレスが提供されます。とても&a == &ref理にかなっています。

于 2012-10-18T08:14:35.327 に答える