С++ Указатели и Ссылки

В данном видео я рассказываю про особенности работы ссылок и указателей в С++, разницу между ними, а также способы грамотного применения данных механизмов.

1414 показов
3.3K3.3K открытий

Поясните тупому, зачем вообще такая сложность при работе с переменными?
Почему я не могу написать как-нибудь так:
int x
x = 1
int a
a = x
?

Ответить

Чувак на видео большой молодец, что занимается просвещением молодёжи, но суть он не передал. Давай я попробую совсем на пальцах совсем базовый случай с примерами.

Что указатели, что ссылки, позволяют тебе говорить про "вон тот объект вон там", не имея копию самого объекта. Это не только про оптимизацию, сколько про просто корректность кода.

Например у тебя по экрану летают самолёты. У каждого самолёта есть аэродром, к которому он приписан. И у аэродрома есть куча самолётов, которые к нему приписаны.

Йолки-палки, у самолётов есть аэродромы, а у аэродромов самолёты. Кто кого куда копировать должен? Как понять, что все самолёты ссылаются на один и тот же сраный аэродром, а не сто разных? Стоп. Ссылаются. О!

class Plane {
  ...
  Airfield& airfield_;  // инициализируется где-то в конструкторе
};

Отлично, значит один аэродром будет "где-то там", а мы будем просто на него ссылаться кучей самолётов. И можно будет например спросить у него "эй, а какие ещё там есть самолёты кроме меня?". Или погоду спросить.

Но стоп. Что если ты хочешь поменять аэродром самолёту? Или вообще сказать, что самолёт ни к какому аэродрому не принадлежит? Можно зафигачить указатель вместо ссылки.

class Plane {
  ...
  Airfield* airfield_ = nullptr;
};

Теперь его можно менять как угодно, и потом писать что-то вроде.

if (airfield_) {
  auto weather = airfield_->GetCurrentWeather();

чтоб спрашивать погоду. И все самолёты смогут так же.

Тут это не "твой личный аэродром, который ты себе скопировал". Это указатель на "вон тот аэродром, который вон там", и который другие куски твоего кода могут менять, и ты эти изменения увидишь из своего самолёта.

Disclaimer: этот код иллюстрирует "что можно с указателями делать", а не "как всегда надо", потому в зависимости от того, что за цирк происходит у тебя в программе, ты можешь захотеть, например, std::weak_ptr, чтоб корректно обрабатывать случаи, когда кто-то снёс аэродром, а тебе не сказали (особенно если код многопоточный). Или нет, в зависимости от того, как спроектирован твой код (может, например, когда аэродром сносят, он в деструкторе обходит все свои самолёты и сообщает им, что он сдох?).

Ответить

Круто, можешь. Только вот язык не ограничивается базовыми типами данных. Да даже если только про базовые говорить: есть у тебя банальный массив double, над каждым элементом которого нужно выполнить какую-то операцию. С указателями ты отдаёшь в функцию адрес первого и последнего элементов, что потребует передачи всего 8 или 16 байт (в зависимости от разрядности системы). Без указателей ты будешь копировать значение каждого элемента (т.е. 8 байт на каждый элемент). Если у тебя проект уровня "лаба первокурсника" то не страшно, конечно. А если ты анализируешь массив данных с радиотелескопа?)

Ответить

Комментарий недоступен

Ответить