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

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

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

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

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

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

Вопрос больше создан как туториал, так что со времем будет дополняться примерами.
  • Вопрос задан
  • 546 просмотров
Подписаться 2 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 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. Как вы его будете передавать?
- вам нужно создать односвязный список. Опишите его структуру.
- у вас есть два массива одного типа. И есть две функции, которые по разному модифицируют массив того же типа. Какие будут прототипы функций?
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы