0

私はこの単純なコードを持っています:

int a = 1, b = 2;
int* c[] = {&a,&b};
int& d[] = {a,b};
int x = *c[0]+d[1];

以下が機能する場合

int &d = a;

3行目と4行目でエラーが発生する理由がわかりません。:-s

それは私には本当に意味がありません:(

4

3 に答える 3

4
int& d[] = {a,b};

参照の配列を作成することはできません。C ++標準では許可されていません。許可するには、型メカニズム全体を書き直す必要があります。

int x = *c[0]+d[1];

dを宣言する前の行にコンパイルエラーがあるため、コンパイラはのタイプを認識できないため、エラーが発生しますd


B b[2]; 

タイプの2つのオブジェクトを作成するため、 2回B呼び出します。B()

b[1]=D();

タイプのオブジェクトを作成しますD。クラス自体とそのBaseクラスのコンストラクターを呼び出し、結果として呼び出しB()D()。作成されたオブジェクトは配列インデックスに格納されます1。ただし、配列はB Object Slicing型であるため、オブジェクトの派生メンバーはすべてスライスされます。基本的に、のオブジェクトは次b[1]のタイプになりますB

b[1].print();

print()オブジェクト型でメソッドを呼び出しますBなぜそれが型であるかについての上記の説明を参照してくださいB

于 2012-06-28T12:04:36.987 に答える
2

最初の部分については、アルスの応答を参照してください。2番目の部分:

  • 最初の2つのコンストラクターは、配列の2つの要素に使用されます。
  • 3番目のBコンストラクターはDのベースです
  • 次にDコンストラクター
  • それからDは一時的なオブジェクトだったのでBと一緒に破壊されています
  • 次に、仮想ではないため、Bのprintメソッドが呼び出されます。
  • 次に、配列の2つのB要素が破棄されます
于 2012-06-28T12:19:31.277 に答える
1

質問1

int& d[] = {a,b};

参照の配列を作成することはできません。配列にはオブジェクトが含まれています。インスタンス、プリミティブ、およびポインタはオブジェクトです。参照はそうではありません。

質問2、質問の変更により回答が省略されました。

于 2012-06-28T12:13:47.517 に答える