В чем разница между типами возврата Reference и Pointer в C++
Если бы я должен был создать простой объект в C++, какая разница между возвращением адреса члена и возвратом указателя. Насколько я знаю, C++ не имеет автоматической сборки мусора, поэтому он не будет вести подсчет ссылок. Итак, почему кто-то сделал бы это так:
class CRectangle {
public:
string& getName( );
int& getWidth( );
int& getHeight( );
private:
string name;
int height;
int width;
};
а не так:
class CRectangle {
public:
string* getName( );
int* getWidth( );
int* getHeight( );
private:
string name;
int height;
int width;
};
Я понимаю, что это позволит вам получить доступ к данным членов, но я не беспокоюсь о правильной инкапсуляции в этом простом примере. Так какая разница? Ускорение? Читаемость? Стиль?
4 ответа
&
(в этом контексте) не означает "адрес".
Функция объявлена как string& getName( );
возвращает ссылку, а не указатель. Ссылка - это псевдоним другого объекта. Таким образом, в этом случае он не возвращает копию имени объекта или указателя на имя, а ссылку на само имя. Таким образом, любые изменения в возвращаемом объекте применяются непосредственно к имени объекта.
Вы можете достичь того же, вернув указатель, но будет два существенных различия:
- указатель требует специального синтаксиса для доступа (
*
а также->
операторы), тогда как ссылка используется точно так же, как и сам объект. - указатель может быть
null
Ссылка не может. Поэтому каждый раз, когда используется указатель, вы сообщаете читателю кода, что "это значение может бытьnull
"
В этом контексте &
означает ссылку, а не адрес.
- Указатель может быть 0 - ссылка не может быть в правильно сформированной программе.
- Владение может быть более неясным, когда вы возвращаете указатель.
- Читаемость субъективна - я бы сказал, используйте ссылку, когда можете.
- Для эффективности нет никакой разницы.
Прежде всего, форма & называется "ссылкой" в C++. Форма * называется "указатель" или "адрес".
Ускорение - без разницы. Читаемость - вероятно, небольшое преимущество для ссылок, отсутствие разыменования в коде upstack.
Стиль - явное нарушение инкапсуляции - достаточно плохой стиль, чтобы скрыть что-либо еще. Если вам нужен объект с голыми данными, то общедоступная структура тоже подойдет.
Нет смысла возвращать указатель на целое число из метода типа свойства, такого как getWidth()
, Это добавляет бремя необходимости отслеживать владение памятью; но на самом деле может увеличить пропускную способность возвращаемого типа (оба int
Размеры указателя зависят от платформы и могут варьироваться, но типичные размеры составляют 32 и 64 бита соответственно).