在 c++ 中混淆了 new something() 和 new something[]

Confusion between new something() and new something[] in c++

本文关键字:something new c++      更新时间:2023-10-16

考虑类A:

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

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

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

我的理解有什么缺陷?

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] 分配的数组的第一个元素的合法方法。

你把它倒过来了。

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

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

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]是一个对象。