В С++-функции, подобной этой:
int& getNumber();
что означает &
? Отличается ли он от
int getNumber();
В С++-функции, подобной этой:
int& getNumber();
что означает &
? Отличается ли он от
int getNumber();
Да, версия int&
возвращает ссылку на int
. Версия int
возвращает значение int
по значению.
Смотрите раздел по ссылкам в FAQ на С++
Это другое.
int g_test = 0;
int& getNumberReference()
{
return g_test;
}
int getNumberValue()
{
return g_test;
}
int main()
{
int& n = getNumberReference();
int m = getNumberValue();
n = 10;
cout << g_test << endl; // prints 10
g_test = 0;
m = 10;
cout << g_test << endl; // prints 0
return 0;
}
getNumberReference() возвращает ссылку, под капотом это как указатель, указывающий на целочисленную переменную. Любые изменения, применяемые к ссылке, относятся к возвращенной переменной.
getNumberReference() также является левым значением, поэтому его можно использовать следующим образом:
getNumberReference() = 10;
Да, это другое.
Это означает, что вы возвращаете ссылку. В противном случае он вернет копию (ну, иногда компилятор ее оптимизирует, но это не проблема).
Примером является вектор. Оператор [] возвращает &. Это позволяет нам:
my_vector[2] = 42;
Это не сработает с копией.
Различие заключается в том, что без &
то, что вы получаете, это копия возвращенного int, подходящего для перехода в другие подпрограммы, по сравнению с материалом или копирования в вашу собственную переменную.
С &
то, что вы получаете, по существу, является переменной, содержащей возвращаемое целое число. Это означает, что вы можете поместить его в левую часть задания, например:
getNumber() = 200;
int& getNumber()
: функция возвращает целое число по ссылке.
int getNumber()
: функция возвращает целое значение по значению.
Они несколько отличаются друг от друга, и одним из интересных отличий является то, что 1-й тип можно использовать в левой части задания, что невозможно для второго типа.
Пример:
int global = 1;
int& getNumber() {
return global; // return global by reference.
}
int main() {
cout<<"before "<<global<<endl;
getNumber() = 2; // assign 2 to the return value which is reference.
cout<<"after "<<global<<endl;
return 0;
}
Ouptput:
before 1
after 2
В первой версии вы можете написать getNumber() = 42
, что, вероятно, не то, что вы хотите. Возвращаемые ссылки очень полезны при перегрузке operator[]
для ваших типов контейнеров. Это позволяет вам писать container[9] = 42
.
"&" означает ссылку, в данном случае "ссылку на int".
Это означает, что это ссылочный тип. Какая ссылка?
Википедия:
В языке программирования С++ ссылка представляет собой простой ссылочный тип данных, который является менее мощным, но более безопасным, чем тип указателя, унаследованный от C. Ссылка на ссылку С++ может вызвать путаницу, так как в информатике ссылка является общим типом данных концепции, с указателями и ссылками на С++, являющимися конкретными реализациями ссылочных типов данных. Объявление формы:
Тип и имя
где - тип и идентификатор, тип которого является ссылкой to.
Примеры:
- int A = 5;
- INT & rA = A;
- extern int & гв;
- INT & foo();
- void bar (int & rP);
- класс MyClass {int & M_B;/*... */};
- int funcX() {return 42; }; int (& xFunc)() = funcX;
Здесь rA и rB имеют тип "reference to int", foo() - функция, которая возвращает ссылку на int, bar() является функция с опорным параметром, это ссылка на int, MyClass - это класс с членом, который ссылка на int, funcX() является функция, возвращающая int, xFunc() является псевдонимом для funcX.
Остальное объяснение здесь
Это ссылка
Это означает, что он возвращает reference в int, а не в int.
Это ссылка, которая в точности похожа на указатель, за исключением того, что вам не нужно использовать оператор-указатель-указатель (* или → ) с ним, подразумевается разыменование указателя.
В частности, обратите внимание, что все проблемы, связанные с жизненным циклом (например, не возвращать переменную стека по адресу), по-прежнему необходимо решать так же, как если бы использовался указатель.