ogregor
@ogregor
арендатор vpn сервера debian

Как понять, как использовать переменные, указатели и ссылки в C++?

Здравствуйте, изучаю С++

Теорию относительно:
  • переменных (копирование)
  • указатель (адрес)
  • ссылка (разименованный адрес)

вроде понял.
Но возникли трудности с пониманием практического применения в ООП (реализация в классах)
В каком случае стоит применять ссылки, указатели, ссылки.

Конечно можно предложить литературу, но вроде с литературой проблем нет, хотелось бы услышать понимание тех, кто постоянно применяет данные методы на практике (ООП в C++)

Вопрос больше создан как туториал, так что со времем будет дополняться примерами.
  • Вопрос задан
  • 546 просмотров
Пригласить эксперта
Ответы на вопрос 2
В параметре функции:
  • Если параметр не нужно модифицировать, то передаём по константной ссылке const T&
  • Если к тому же параметр -- это POD размером не более 32 байт, то можно передать по значению T
  • Если параметр нужно модифицировать, то передаём по неконстантной ссылке T&
  • Если параметр может отсутствовать (nullptr), то передаём по указателю T* / const T*. Константность зависит от того, надо ли параметр модифицировать
  • Если нужно скопировать внутрь текущего объекта параметр шаблонного типа, то используем универсальную ссылку T&&


В возвращаемом значении:
  • Если нужно вернуть результат, вычисленный в функции, возвращаем значение
  • Если нужно вернуть указатель на фиксированную область памяти, возвращаем ссылку / указатель. Различие в использовании и константность подробно описаны выше
  • Если мы хотим передать владение, возвращаем std::unique_ptr


В поле класса:
  • Почти всегда по значению
  • Указатель указывает на память, которой мы не владеем (не имеем права делать delete). Ссылки нельзя использовать ввиду технических ограничений
  • std::unique_ptr указывает на память, которой мы владеем. Предпочитать значению его следует, если это полиморфный тип


Замечание 1. Есть типы, перемещение которых дорого или невозможно: большой std::array, std::fstream. Если мы хотим передавать владельца переменной такого типа или, например, вернуть из функции, то придётся использовать std::unique_ptr.

Замечание 2. "Нужно модифицировать" означает, что мы хотим, чтобы изменения объекта были видны вне функции. Можно и нужно обходиться константной ссылкой, если допустимо скопировать переменную и модифицировать её внутри функции.
Ответ написан
GavriKos
@GavriKos
Практика спасет вас. Со временем поймете где что нужно.
Для приближения к пониманию можете попробовать сами ответить на следующие вопросы:
- как быть, если в результате выполнения функции надо получить два значения?
- вам нужно передать в функцию Bitmap. Как вы его будете передавать?
- вам нужно создать односвязный список. Опишите его структуру.
- у вас есть два массива одного типа. И есть две функции, которые по разному модифицируют массив того же типа. Какие будут прототипы функций?
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы