c ++中new something()和new something []之间的混淆

时间:2015-04-28 01:32:17

标签: c++ pointers

考虑A类:

class A
{
public:
int x;
int y;
}

现在如果我们写A *a = new A()那么 a 是指向A类元素的指针。但是,如果我们写A *a = new A[5]那么 a [0] < / b>不是指针而是类的实例。

我希望a[n]的行为像指针一样,因此像a[0]->x这样的操作可以保持有效。

我理解的缺陷是什么?

3 个答案:

答案 0 :(得分:2)

a是指针时,根据定义,语法a[N]等同于(*(a + N))。因此,取消引用已包含在表达式中。 new A()new A[N]之间的差异在于分配的内容(单个元素与多个元素)。但是,在这两种情况下,都会返回指向单个元素的指针(new A()中的唯一元素,new A[N]中的第一个元素)。在这两种情况下,可以在该指针上使用的语法是相同的。请注意以下事项:

A* a = new A();
a[0].x = 10;

这是一种合法(尽管不常见)的方式来访问由表达式new A()分配的单个对象。同样地:

A* a = new A[N];
a->x = 10;

这是访问由new A[N]表达式分配的数组的第一个元素的合法方式。

答案 1 :(得分:1)

你倒退了。

A *a = new A();
a[0]->a = 5;

不会编译,因为直括号运算符返回对数组元素的引用,而不是指向空格的指针。它可以被认为等同于*(a + 0)。这意味着a[0].a是在使用括号运算符时引用类实例的成员的方法。请注意,a->a = 5将编译是正确的,但如果您将a声明为A a[5];

,情况也同样如此

答案 2 :(得分:0)

A *a[5];

 for (int i = 0; i < 5; i++)
 {
     A *p = new A;
     a[i] = p;
 }

是您想要的,推荐std::vectorA *a = new A[5]表示a是指向对象数组的指针,因此a[i]是一个对象。