69 lines
3 KiB
C++
69 lines
3 KiB
C++
|
#include <iostream>
|
|||
|
using std::cout, std::endl;
|
|||
|
|
|||
|
|
|||
|
/*
|
|||
|
В 90% случаях ссылки используются для того чтобы передать что либо в функцию
|
|||
|
Часто нам хочется передать переменную в функцию и изменить её там (внутри функции)
|
|||
|
Это можно делать и с помощью указателей, но с помощью ссылок это делать гораздо удобней
|
|||
|
Рассмотрим два эквивалентных участка кода:
|
|||
|
|
|||
|
Передаём по указателю: Передаём по ссылке:
|
|||
|
|
|||
|
void sqr(int* p) void sqr(int& r)
|
|||
|
{ {
|
|||
|
*p = *p * *p; r = r * r;
|
|||
|
} }
|
|||
|
|
|||
|
int main() int main()
|
|||
|
{ {
|
|||
|
int a = 5; int a = 5;
|
|||
|
sqr(&a); sqr(a);
|
|||
|
cout << a << endl; cout << a << endl;
|
|||
|
} }
|
|||
|
|
|||
|
|
|||
|
Обратите внимание на 2 вещи:
|
|||
|
1) Ссылку не нужно разыменовывать внутри функции, это происходит автоматически
|
|||
|
|
|||
|
2) При передаче в функцию, не нужно передавать адрес переменной
|
|||
|
Нужно передать саму переменную, компилятор сам вычислит её адрес
|
|||
|
|
|||
|
При этом копирования объекта a в функцию не происходит,
|
|||
|
ссылки работают также быстро как и указатели
|
|||
|
*/
|
|||
|
|
|||
|
void sqr(int& r)
|
|||
|
{
|
|||
|
r = r * r;
|
|||
|
}
|
|||
|
|
|||
|
int main()
|
|||
|
{
|
|||
|
int a = 5;
|
|||
|
sqr(a);
|
|||
|
|
|||
|
cout << a << endl;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
/*
|
|||
|
Задачи:
|
|||
|
|
|||
|
1) Напишите функцию void inc(int& x), которая должна принимать объект типа int
|
|||
|
и увеличивать его на 1
|
|||
|
Вызовите эту функцию из main и протестируйте её работу
|
|||
|
|
|||
|
2) Напишите функцию void normalize(float& x, float& y), которая должна принимать
|
|||
|
2 объекта типа float и нормализировать их. То есть делить их на некоторое число,
|
|||
|
так чтобы было x*x + y*y == 1
|
|||
|
|
|||
|
Для этого x и y нужно разделить на sqrt(x*x + y*y)
|
|||
|
|
|||
|
|
|||
|
3) Можно ли передать в функцию sqr не переменную, а число?
|
|||
|
То есть, можно ли написать так:
|
|||
|
sqr(5)
|
|||
|
|
|||
|
|
|||
|
*/
|