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]; 

创建两个类型的对象,B因此调用B()两次。

b[1]=D();

创建一个 类型的对象D。为此它调用类本身及其基类的构造函数,从而导致调用B()D(). 创建的对象存储在数组索引处1。然而,由于数组的类型是B 对象切片,因此对象的所有派生成员都被切片。本质上,b[1]现在的对象是类型B

b[1].print();

调用print()对象类型的方法B参见上面的解释为什么它是类型B

于 2012-06-28T12:04:36.987 回答
2

对于第一部分,请参阅 Als 的回复。第二部分:

  • 前两个构造函数用于数组的 2 个元素。
  • 第三个 B 构造函数是 D 的基础
  • 然后是一个 D 构造函数
  • 然后 D 与 B 一起被销毁,因为它是一个临时对象
  • 然后调用 B 的 print 方法,因为它不是虚拟的
  • 然后数组中的两个 B 元素被销毁
于 2012-06-28T12:19:31.277 回答
1

问题 #1

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

你不能做一个引用数组。数组包含对象。实例、原语和指针都是对象。参考不是。

问题#2,由于问题的变化而省略了答案。

于 2012-06-28T12:13:47.517 回答