& возвращаемый тип объявления функции

Что означает и означает следующее:

class Something
{
 public:
   int m_nValue;

   const int& GetValue() const { return m_nValue; }
   int& GetValue() { return m_nValue; }
};

Этот код взят из здесь.

Ответ 1

Это означает возвращаемое значение по ссылке:

   int& GetValue()
     ^ Means returns a reference of int

Как

int i = 10;

int& GetValue() {
    int &j = i;
    return j;
}

j является ссылкой i, глобальной переменной.

Примечание. В С++ у вас есть три вида переменных:

  • Значение переменной, например int i = 10.
  • Исходная переменная, например int &j = i; ссылочная переменная создает псевдоним другой переменной, оба являются символическими именами того же места в памяти.
  • Адресная переменная: int* ptr = &i. называемых указателями. Переменные указателя используют для хранения адреса переменной.

Отказ в объявлении

   Pointer:
           int  *ptr = &i;
                ^      ^  & is on the left side as an address operation
                |
                * For pointer variable.

   Reference:

           int &j = i;
               ^
               | & on the right side for reference

Помните, что в C у вас есть только два значения переменных и адреса переменных (указатель). Контрольные переменные находятся в С++, а ссылки просты в использовании, как переменные значений, и такие же, как переменные указателя.

Указатели выглядят следующим образом:

                      j = &i;

                      i                   j
                   +------+            +------+
                   | 10   |            | 200  |
                   +------+            +------+
                     202                 432

Ссылка выглядит так:

                   int &j = i;

                    i, j
                   +------+
                   | 10   |
                   +------+

Для j не выделяется память. Это псевдоним того же места в памяти.

Каковы различия между переменной указателя и ссылочной переменной в С++?

  • Указатель может быть повторно назначен любым количеством раз, в то время как ссылка не может быть переназначена после инициализации.
  • Указатель может указывать на NULL, в то время как ссылка никогда не может указывать на NULL
  • Вы не можете взять адрес ссылки, как вы можете, с помощью указателей.
  • Theres нет "ссылочной арифметики" (но вы можете взять адрес объекта, на который указывает ссылка, и сделать на нем арифметику указателя, как в & obj + 5).

Потому что, как вы прокомментировали, у вас есть вопросы о различиях между указателями и ссылочными переменными, поэтому я настоятельно рекомендую вам прочитать связанные страницы из ссылки, приведенной в моем ответе.