`Array [i]` vs `Array + i` - PullRequest
       2

`Array [i]` vs `Array + i`

0 голосов
/ 17 марта 2019
#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 ]

4 голосов
/ 17 марта 2019

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 голос
/ 17 марта 2019

p_to_plane - это Plane* (указатель).

*p_to_plane разыменовывает этот указатель, давая вам Plane (первый в массиве).

p_to_plane+i увеличивает этот указатель, давая вам скорректированный указатель на другое место в массиве.

*(p_to_plane+i) задерживает скорректированный указатель, давая вам Plane (ih в массиве).

p_to_plane[i] - это то же самое, что и *(p_to_plane+i).

Итак, компилятор прав: [] уже сделал разыменование для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...