gpt4 book ai didi

c++ - `Array[i]` 与 `Array+i`

转载 作者:太空宇宙 更新时间:2023-11-04 15:56:51 25 4
gpt4 key购买 nike

#include <iostream>
#include <string>

using namespace std;

class Plane
{
private:
// data member
string name;

public:
// constructor
Plane();

// destructor
~Plane();

// member function
void setName(string na);
};

int main()
{
int num_plane;

cout << "How many planes do you have? ";
cin >> num_plane;

Plane *p_to_plane = new Plane[num_plane];

string name;
for (int i = 0; i < num_plane; ++i)
{
cout << "The No. " << (i + 1) << " plane's name: ";
cin >> name;

(p_to_plane + i)->setName(name);
}


delete [] p_to_plane;

system("Pause");

return 0;
}

我有一个问题:

在 main 函数中,有一个 for 循环来为每个平面添加名称。但是,如果我编写 p_to_plane[i]->setName(name),则会发生错误。编译器要求我编写 p_to_plane[i].setName(name)

我不明白为什么。如果是p_to_plane[i].setName(name),那么p_to_plane[i]应该是类对象。但是,它不应该是指向类对象的指针吗?

此外,我无法区分 p_to_plane[i]p_to_plane + i 之间的区别。它们是一样的吗?

最佳答案

a[b] 表示 *(a + b)。这是一个取消引用操作。

同理,a->b表示(*a).b

如果 p 是指向对象数组第一个元素的指针,那么您可以使用以下任一方法访问它们的方法

  1. (*(p + i)).foo()
  2. (p + i)->foo()
  3. p[i].foo()

在变体 #2 中,-> 运算符正在执行取消引用;在变体 #3 中,[] 运算符正在执行取消引用。

(如果你真的想把它们结合起来,你需要像 (&p[i])->foo() 这样的东西,但那太傻了。)

关于c++ - `Array[i]` 与 `Array+i`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55208644/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com