考虑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
这样的操作可以保持有效。
我理解的缺陷是什么?
答案 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::vector
。 A *a = new A[5]
表示a
是指向对象数组的指针,因此a[i]
是一个对象。