4

クラスを作成しましたが、サイズがゼロです。では、すべてのオブジェクトが異なるアドレスを持っていることを確認するにはどうすればよいでしょうか? (ご存じのとおり、空のクラスのサイズはゼロではありません。)

#include<cstdio>
#include<iostream>
using namespace std;
class Test
{
    int arr[0];//Why is the sizezero?
};

int main()
{
    Test a,b;  
      cout <<"size of class"<<sizeof(a)<<endl;
       if (&a == &b)// now how we ensure about address of objects ?
          cout << "impossible " << endl;
       else
          cout << "Fine " << endl;//Why isn't the address the same? 

        return 0;
}        
4

4 に答える 4

8

あなたのクラス定義は違法です。C++ では0、どのコンテキストでもサイズを指定した配列宣言は許可されていません。ただし、クラス定義を完全に空にしてsizeofも、 はゼロ以外の値に評価される必要があります。

9/4 クラス型の完全なオブジェクトとメンバー サブオブジェクトは、ゼロ以外のサイズを持つ必要があります。

つまり、コンパイラがクラス定義を受け入れ、上記sizeofをゼロと評価する場合、そのコンパイラは標準 C++ 言語の範囲外になります。標準 C++ とは関係のないコンパイラ拡張機能でなければなりません。

したがって、この場合の「なぜ」という質問に対する唯一の答えは、それがコンパイラに実装されている方法だからです。

異なるオブジェクトが異なるアドレスを持つことを保証することと、それが何の関係があるのか​​ わかりません。コンパイラは、オブジェクトのサイズがゼロかどうかに関係なく、これを簡単に強制できます。

于 2013-08-31T18:05:07.867 に答える
1
  • 変数の宣言と変数の初期化には違いがあります。あなたの場合、変数を宣言するだけです。A と B. 変数を宣言したら、NEW または MALLOC を使用して初期化する必要があります。
  • 初期化により、宣言した変数にメモリが割り当てられます。変数は、任意のサイズまたはメモリ ブロックに初期化できます。
  • A と B はどちらも変数であり、2 つの変数 A と B を作成したことを意味します。コンパイラはこの変数を一意の変数として識別し、A を 2000 などのメモリ アドレスに割り当て、次に B を別のメモリ アドレス (150 など) に割り当てます。
  • A が B を指すようにするか、B が A を指すようにする場合は、次のように A または B への参照を作成できます。A = &B. 現在、A は B へのメモリ参照またはアドレスとして、またはむしろ A は B を指しています。これは、変数の受け渡しと呼ばれます。C++ では、参照によって変数を渡すことも、値によって変数を渡すこともできます。
于 2013-08-31T20:46:25.010 に答える