тип возврата выбрать в C ++

0

В C я думаю, что нет ссылки, поэтому возвращаемое значение может быть указателем или самим типом данных. Если это локальная переменная, вернуть указатель не имеет никакого смысла. Если переменная динамически распределена, может быть возвращен только указатель.

Однако в C++ есть новый выбор, ссылка. Если то, что я хочу вернуть, является локальной переменной, я думаю, что я могу только выбрать возврат себя, потому что другим двум будет нечего ссылаться или указывать после возвращения функции. Если я динамически выделяю переменную, что я возвращаю? Указатель или ссылка? Какое преимущество и недостаток? Почему бы просто не вернуть переменную?

Очень простой пример:

class TreeNode
{
//......May be some elements and functions.
}

TreeNode& test()
{
  TreeNode* temp = new TreeNode;
  return *temp;
}

Я не верю, указатель или ссылку?

  • 1
    показать реальный кусок кода в качестве примера
Теги:
pointers
return-value
reference

4 ответа

1
Лучший ответ

Если я динамически выделяю переменную, что я возвращаю?

Верните указатель (обычный или умный, в зависимости от ситуации). Не возвращайте ссылку на динамически выделенные объекты: в конце концов вам нужно будет освободить память для объекта; конструкция delete &someRef которую вы должны использовать, крайне несовместима.

Возврат ссылки подходит, когда вы возвращаетесь из функции-члена, а возвращаемая вами ссылка относится к члену или когда вы возвращаете ссылку на объект, который был передан вашей функции в первую очередь.

Почему бы просто не вернуть переменную?

Это очень правильный выбор: возврат по значению позволяет не беспокоиться об управлении памятью и владением объектами. Самым большим препятствием является стоимость копирования. Однако их неэффективность часто сильно завышена, что приводит к преждевременной оптимизации.

  • 0
    Извините, я до сих пор не понимаю, когда вернуть ссылку. Не могли бы вы рассказать немного подробнее или показать простой пример?
  • 0
    Пример (скорее надуманный): если класс TreeNode имеет string name переменной-члена, то у вас может быть функция-член: string& getName() { return name; } getName возвращает ссылку на переменную-член.
Показать ещё 3 комментария
0

Если вы вернете ссылку или указатель, вы вернете адрес переменной.

Если вы вернете переменную, вы вернете копию переменной. С большими переменными накладные расходы на копирование (особенно при динамическом распределении, с локальными переменными компилятор может в некоторых случаях оптимизировать код и избежать копирования).

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

0

Если вы динамически выделяете переменную, вы можете вернуть либо указатель, либо ссылку.

Если переменная, которую вы возвращаете, потребляет большой объем памяти, лучше вернуть указатель или ссылку, чем сама переменная.

  • 0
    Вы имеете в виду, иначе у меня будет две копии в моей памяти?
  • 0
    @ user3352668 Да, у вас будет две копии одинаковых данных в памяти.
0

В окончательном скомпилированном машинного кода ссылка в основном такая же, как указатель. Его просто C++, который определяет другой набор правил и синтаксиса для ссылок. Подумайте об этом как о указателе, который может быть (и должен быть) инициализирован только один раз, когда вы его объявите, и он никогда не может быть NULL. Если вы вернете ссылку, вы в основном возвращаете указатель, но вы указали вызывающему, что возвращаемое значение является "указателем" (ссылкой), которое не может быть NULL. Ссылочные параметры схожи, с параметром ссылочной функции/метода вы просто передаете указатель на что-то, и вы скажете реализации функции, что этот "указатель" никогда не равен NULL.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню