void f(int i) {}
-- эта функция ожидает получить один параметр int
и не вернёт ничего.void f(int *i){}
-- эта ожидает указатель, я так понимаю.void f(int &i){}
-- что ожидает на входе эта функция?Вкратце можно сказать следующее.
Параметр этой функции
void f(int &i){}
определяет так называемую lvalue
ссылку.
Такое определение функции позволяет изменить аргумент, переданный функции, так как в функцию передается не копия значения аргумента, а аргумент передается по ссылке. Например,
#include <iostream>
void g( int i )
{
i += 10;
}
void h( int &i )
{
i += 10;
}
int main()
{
int i = 0;
std::cout << "Before call g( i ) i = " << i << '\n';
g( i );
std::cout << "After call g( i ) i = " << i << '\n';
std::cout << '\n';
std::cout << "Before call h( i ) i = " << i << '\n';
h( i );
std::cout << "After call h( i ) i = " << i << '\n';
return 0;
}
Вывод программы на консоль
Before call g( i ) i = 0
After call g( i ) i = 0
Before call h( i ) i = 0
After call h( i ) i = 10
То есть функция g
имеет дело с копией значения переменной i
. Сама исходная переменная i
, объявленная в main
, не изменяется.
С другой стороны, функция h
изменяет исходную переменную i
, так как она передается в функцию по ссылке.
Имейте в виду, что можно параметр функции объявить также как
int &&i
Это так-называемая rvalue
ссылка, предназначенная для работы с временными объектами.
Рассмотрите такую программу.
#include <iostream>
void f( int && )
{
std::cout << "void f( int && )\n";
}
void f( int * )
{
std::cout << "void f( int * )\n";
}
void f( int & )
{
std::cout << "void f( int & )\n";
}
int main()
{
int i = 0;
f( 0 );
f( i );
f( &i );
return 0;
}
Ее вывод на консоль:
void f( int && )
void f( int & )
void f( int * )
Короткий ответ: эта функция ожидает на входе lvalue типа int
. Параметр-ссылка i
будет привязана к тому lvalue, которое вы передадите в качестве аргумента.
Длинный ответ: Почитайте литературу о ссылках в C++. Ссылки в C++ - базовое свойство языка C++ и слишком обширная тема, чтобы пытаться покрыть ее в одном ответе.
Чем отличаются ссылки от указателей в С++
Виртуальный выделенный сервер (VDS) становится отличным выбором
Есть ли встроенные методы, позволяющие сравнить изображения на полное сходство (Не просто == или imgequals(img2), ибо в первом это разные объекты,...
Был у меня recyclerview с адаптером и все было крутоЯ добавил view
Пишу программу на JavaFX И Scene BuilderВ качестве базы данных использую SQLite
Собственно, весь вопрос поставлен в заголовкеОднако, при вращении обнаружены некоторые баги