指针和参考棘手的代码

时间:2012-06-28 12:01:40

标签: c++ pointers reference

我有这段简单的代码:

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

这对我来说毫无意义:(

3 个答案:

答案 0 :(得分:4)

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

您无法创建引用数组。 C ++标准不允许这样做。为了允许它,必须重写整个类型机制。

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

给你一个错误,因为编译器无法确定d的类型,因为你声明d的前一行有一个编译错误。


B b[2]; 

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

b[1]=D();

创建D类型的对象。为此调用类本身的构造函数及其Base类,从而产生调用B()D()。创建的对象存储在数组索引1中。但是,由于数组的类型为B Object Slicing ,因此会切断对象的所有派生成员。基本上,b[1]处的对象现在属于B

类型
b[1].print();

在对象类型print()上调用B方法(请参阅上面的说明,为什么类型为B

答案 1 :(得分:2)

第一部分见Als的回应。第二部分:

  • 前两个构造函数进入数组的2个元素。
  • 第三个B构造函数是D
  • 的基础
  • 然后是D构造函数
  • 然后D与B一起被销毁,因为它是一个临时对象
  • 然后调用B的print方法,因为它不是虚拟的
  • 然后销毁阵列中的两个B元素

答案 2 :(得分:1)

问题#1

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

您无法创建引用数组。数组包含对象。实例,基元和指针是对象。参考文献不是。

问题#2,由于问题的变化,答案被删除了。