2

我对取自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(),这导致我减速dwhere CRectangle * d = new CRectangle[2];。是不是有两个间接级别,所以不d应该声明,CRectangle ** d因为 new 返回一个指针,它是一个指向指针的指针,因为它是一个数组(因此是 [])。换句话说不是**=*[]吗?

4

2 回答 2

2

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

于 2013-07-08T19:56:49.760 回答
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] ...
值 ABCDEFGH ...
偏移量:0 +1 +2 +3 +4 +5(当然是 x sizeof(CRectangle))...
于 2013-07-08T19:56:41.593 回答