Array [i]与Array + i

时间:2019-03-17 15:22:51

标签: c++ class pointers

#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;
}

我有一个问题:

在主函数中,有一个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之间的区别。他们是一样的吗?

2 个答案:

答案 0 :(得分:4)

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()之类的东西,但这很愚蠢。)

答案 1 :(得分:1)

p_to_planePlane*(指针)。

*p_to_plane取消引用该指针,为您提供一个Plane(数组中的第一个)。

p_to_plane+i递增该指针,使您可以调整指向数组其他位置的指针。

*(p_to_plane+i)遵循调整后的指针,为您提供Plane(数组中的第i个字符)。

p_to_plane[i]*(p_to_plane+i)相同。

因此,编译器是正确的: []已经为您完成了取消引用。