动态分配数组的元素在第一个元素后不使用 ->运算符?

Elements of dynamically allocated array don't use -> operator after first element?

本文关键字:元素 gt 运算符 数组 第一个 动态分配      更新时间:2023-10-16

我正在阅读一篇关于C++的教程,该教程演示了如何使用下标语法从数组的元素调用对象的公共方法。它是这样的:

Foo* array = new Foo[2];
array->public_function();
array[1].public_function();

现在我了解了变量array指向数组的第一个元素,因此使用->运算符访问该元素的公共数据和函数。我的问题是,为什么对array[1]的调用会有任何不同——为什么它会使用.语法而不是->语法?数组的所有元素不是都是指针吗?

使用索引[]后,将获得对象,而不是指向对象的指针。

考虑以下示例,该示例通过使用指针算术直接处理指针。

Foo* array = new Foo[2];
// Following four are equivalent.   
array[0].public_function();
array->public_function();
(array + 0)->public_function();
(&array[0])->public_function();
// Following three are equivalent.
array[1].public_function();
(array + 1)->public_function();
(&array[1])->public_function();

您可以将其视为[]运算符返回对Foo的引用,因此您可以使用.运算符来访问其成员。

array->public_function()(*array).public_function()相同,后者与array[0].public_function()相同。您正在通过指向Foo对象实例的原始指针访问public_function()。编译器不知道指针实际上是Foo实例的数组。正如您所说,array只是指向数组中第一个元素的指针。以上所有语法在任何对象指针上都有效。由于您处理的是数组,因此应坚持使用array[0].public_function()语法以确保一致性和可读性。