5

次の C++ コードの出力は何ですか?

#include<iostream> 
using namespace std;
class IndiaBix
{
    int x, y; 
    public:
    IndiaBix(int xx)
    {
        x = ++xx;
    } 
    ~IndiaBix()
    {
        cout<< x - 1 << " ";
    }
    void Display()
    {
        cout<< --x + 1 << " ";
    } 
};
int main()
{
    IndiaBix objBix(5);
    objBix.Display();
    int *p = (int*) &objBix;
    *p = 40;
    objBix.Display();
    return 0; 
}

次の行がわかりませんでした::

 int *p = (int*) &objBix;//Explicit type cast of a class object to integer pointer type
4

1 に答える 1

12

(標準レイアウト型の) オブジェクト ポインターを、その最初のメンバーへのポインターにキャストすることができます。これは、標準レイアウト オブジェクトの最初のメンバーがオブジェクト全体と同じアドレスを持つことが保証されているためです。

9.2 クラスメンバー [class.mem]

20 - reinterpret_cast を使用して適切に変換された標準レイアウト構造体オブジェクトへのポインターは、その最初のメンバー (または、そのメンバーがビットフィールドの場合は、それが存在するユニット) を指し、その逆も同様です。

したがって、は標準レイアウトであるため、int *p = (int*) &objBix;へのポインタです。そのデータ メンバーとの両方がであり、クラスにメソッドまたは基本クラスがありません。objBix.xobjBixxyprivatevirtual

于 2012-08-23T13:38:04.173 に答える