在 c++ 中混淆了 new something() 和 new something[]
Confusion between new something() and new something[] in c++
考虑类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]
是一个对象。
相关文章:
- 如果"new int"返回"int*",那么为什么"new int[n]"不返回"int**"?
- 有没有一种方法可以使用placement new将堆叠对象分配给分配的内存
- 重载运算符new[]的行为取决于析构函数
- 过载'operator new'如何导致无限循环?
- 创建具有 new in 函数和"this is nullptr"异常的对象
- Codelite C++ new project
- 在类c++中使用new声明数组
- g++用户定义的动态链接库上的全局new和delete运算符
- 如果整个应用程序是虚拟映射的,为什么 new 会进行系统调用?
- 在将 new 与指针一起使用时,创建数组的指定长度
- 体系结构x86_64的未定义符号:std:terminate(),typeinfo,运算符delete[],运算符new
- 为什么我的全局 new() 覆盖被绕过了?
- 声明C++数组(带或不带 "new" 关键字)
- 在C++中,如果我可以直接将整数分配给指针而不使用"new",为什么要使用"new"?
- 是否可以使用 new 指定具有宏常量的动态分配数组的元素?
- constexpr new 如何分配内存?
- 放置 new 和 uninitialized_fill() 的行为
- 使用 new 和 值进行数组初始化,但没有显式数量的元素
- different between int **arr =new int [ n]; and int a[i][j]?
- 在 c++ 中混淆了 new something() 和 new something[]