Как понять, как использовать переменные, указатели и ссылки в C++?
В параметре функции:Если параметр не нужно модифицировать, то передаём по константной ссылке 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. "Нужно модифицировать" означает, что мы хотим, чтобы изменения объекта были видны вне функции. Можно и нужно обходиться константной ссылкой, если допустимо скопировать переменную и модифицировать её внутри функции.
Практика спасет вас. Со временем поймете где что нужно.
Для приближения к пониманию можете попробовать сами ответить на следующие вопросы:
- как быть, если в результате выполнения функции надо получить два значения?
- вам нужно передать в функцию Bitmap. Как вы его будете передавать?
- вам нужно создать односвязный список. Опишите его структуру.
- у вас есть два массива одного типа. И есть две функции, которые по разному модифицируют массив того же типа. Какие будут прототипы функций?