Назначение значений массива с указателем - PullRequest
0 голосов
/ 19 декабря 2018

Я практикую базовый ООП с C ++ и, используя указатель, обнаружил, что мне не нужно разыменовывать указатель для присвоения значения.Почему это?Menu.h:

class Menu { public:
int MenuCount;
int NumItems;
Drinks *Items;

Menu.cpp

Menu::Menu(Drinks a, Drinks b, Drinks c)  {
std::cout << "How many items would you like on this menu? "; std::cin >> NumItems;
Items = new Drinks[NumItems];
Items[0] = a; Items[1] = b; Items[2] = c; // why is it I can assign values by pointer without dereferencing? 
MenuCount = 3;

Насколько я понимаю, мне пришлось бы разыменовать Items с * до назначения нового объекта в массив, тем не менее этокод работает.

Ответы [ 3 ]

0 голосов
/ 19 декабря 2018

Оператор [] неявно разыменовывает указатель.Он скрывает арифметику указателей с массивами, и поскольку массивы затухают до указателей на первый элемент, он работает так же хорошо с указателем, как массив.

0 голосов
/ 19 декабря 2018
Menu::Menu(Drinks a, Drinks b, Drinks c)  {
    std::cout << "How many items would you like on this menu? "; std::cin >> NumItems;
    1#  Items = new Drinks[NumItems];
    2#  Items[0] = a; Items[1] = b; Items[2] = c; // why is it I can assign values by pointer without dereferencing? 
    MenuCount = 3;
}
  1. Мы назначаем указатель на указатель, new Drinks [] создаст массив в куче и вернет указатель на него.

  2. Items [0] совпадает с (* Items + 0), он будет увеличивать указатель разыменовывая его в этой точке.

0 голосов
/ 19 декабря 2018

В вашем случае Items[0] фактически совпадает с *(Items + 0), поэтому он уже выполняет разыменование для вас.

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