& в объявлении функции возвращает тип
Что означает & в следующем?
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
глобальная переменная.
Примечание: в C++ у вас есть три вида переменных:
- Значение переменной например
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 у вас есть только два вида переменных value и address (указатель). Ссылочные переменные есть в C++, и ссылки просты в использовании как переменные значения и так же способны, как переменные указателя.
Указатели похожи на:
j = &i;
i j
+------+ +------+
| 10 | | 200 |
+------+ +------+
202 432
Ссылка, как:
int &j = i;
i, j
+------+
| 10 |
+------+
Нет памяти выделено для j. Это псевдоним того же места в памяти.
Каковы различия между указательной переменной и ссылочной переменной в C++?
- Указатель может быть переназначен любое количество раз, в то время как ссылка не может быть переназначена после инициализации.
- Указатель может указывать на NULL, а ссылка никогда не может указывать на NULL.
- Вы не можете взять адрес ссылки, как вы можете с указателями
- Там нет "ссылочной арифметики" (но вы можете взять адрес объекта, на который указывает ссылка, и выполнить арифметику указателей на нем, как в &obj + 5).
Поскольку, как вы прокомментировали, у вас есть вопросы о различиях между указателями и ссылочными переменными, поэтому я настоятельно рекомендую вам прочитать соответствующие страницы по ссылке, которую я дал в своем ответе.