Какая разница между типами ссылок 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 бит соответственно).