对象数组的变量类型

时间:2013-07-08 19:52:33

标签: c++ pointers

我对以下来自cplusplus.com

的示例感到困惑
// pointer to classes example
#include <iostream>
using namespace std;

class CRectangle {
    int width, height;
  public:
    void set_values (int, int);
    int area (void) {return (width * height);}
};

void CRectangle::set_values (int a, int b) {
  width = a;
  height = b;
}

int main () {
  CRectangle a, *b, *c;
  CRectangle * d = new CRectangle[2];
  b= new CRectangle;
  c= &a;
  a.set_values (1,2);
  b->set_values (3,4);
  d->set_values (5,6);
  d[1].set_values (7,8);
  cout << "a area: " << a.area() << endl;
  cout << "*b area: " << b->area() << endl;
  cout << "*c area: " << c->area() << endl;
  cout << "d[0] area: " << d[0].area() << endl;
  cout << "d[1] area: " << d[1].area() << endl;
  delete[] d;
  delete b;
  return 0;
}

我在考虑为什么d[0].area()合法而不是d[0]->area(),这导致我d减速CRectangle * d = new CRectangle[2];。是不是有两个级别的间接所以不应该dCRectangle ** d声明,因为new返回一个指针,它是一个指向指针的指针,因为它是一个数组(因此是[])。换句话说,不是**=*[]

2 个答案:

答案 0 :(得分:2)

CRectangle * d = new CRectangle[2];d声明为CRectangle的指针,并将其初始化为指向包含两个CRectangle对象的数组的第一个对象。因此,d[0]的类型为CRectangle不是指向CRectangle的指针。这就是使用点运算符(。)是合法的原因。

答案 1 :(得分:1)

有关:

CRectangle *d = new CRectangle[2];

(大致)等同于(永远,永远,永远不会这样做;只使用新的):

CRectangle *d = (CRectangle*)malloc(2*sizeof(CRectangle));
... plus some default construction ...

d是一个指针。 d [0]不是指针,它是数组索引0处的值。

d [n]是*(d + n)的简写,它是数组d中位置'n'处的值(因此是取消引用*)。 new CRectangle[2]的返回值为CRectangle*

数组存储在内存中,如:

       d[0] [1] [2] [3] [4] [5] [6] [7] ...
Value    A   B   C   D   E   F   G   H  ... 
offset:  0  +1  +2  +3  +4  +5  ( x sizeof(CRectangle) of course)...