Какая разница между типами ссылок Reference и Pointer в С++
Если бы я должен был создать простой объект в С++, в чем разница между возвратом адреса члена или возвратом указателя. Насколько мне известно, С++ не имеет автоматической сборки мусора, поэтому не будет содержать счетчик ссылок. Итак, почему кто-то сделает это так:
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;
};
Я понимаю, что это позволит вам получить доступ к данным о членах, но я не беспокоюсь о правильной инкапсуляции в этом простом примере. Так в чем разница? Ускорение? Читаемость? Стиль?
Ответы
Ответ 1
&
(в этом контексте) не означает "адрес".
Функция, объявленная как string& getName( );
, возвращает ссылку, а не указатель. Ссылка по существу является псевдонимом для другого объекта. Поэтому в этом случае он не возвращает копию имени объекта или указателя на имя, а ссылку на само имя. Поэтому любые изменения в возвращаемом объекте непосредственно применяются к имени объекта.
Вы могли бы добиться этого, вернув указатель, но было бы два существенных отличия:
- указателю требуется специальный синтаксис для доступа (операторы
*
и ->
), тогда как ссылка используется точно так же, как вы использовали бы этот объект.
- указатель может быть
null
, ссылка не может. Поэтому в любое время, когда используется указатель, вы сигнализируете читателю код, что "это значение может быть null
"
Ответ 2
В этом контексте &
означает ссылку - not address-of.
- Указатель может быть 0 - ссылка не может быть выполнена в хорошо сформированной программе.
- Собственность может быть более неясной при возврате указателя.
- Считываемость субъективна - я бы сказал, используя ссылку, когда вы можете.
- Для эффективности нет никакой реальной разницы.
Ответ 3
Во-первых, форма и называется "ссылкой" на С++. Форма * называется "указателем" или
"адрес".
Ускорение - нет разницы. Считываемость - возможно, небольшое преимущество для ссылок, без дефрагментации в коде upstack.
Стиль - явное нарушение инкапсуляции - это плохой стиль, чтобы обрезать что-либо еще. Если вам нужен объект с обнаженными данными, все-публичная структура будет делать то же самое.
Ответ 4
Я не могу придумать, как вернуть указатель на целое число из метода типа свойства, такого как getWidth()
. Это увеличивает нагрузку на отслеживание владения памятью; но на самом деле вероятно увеличит пропускную способность возвращаемого типа (как int
, так и размеры указателей зависят от платформы, и могут и могут меняться, но типичные размеры - 32 и 64 бит соответственно).