This repository has been archived on 2023-05-13. You can view files and clone it, but cannot push or open issues or pull requests.
mipt_cpp/seminar01_overload/classroom_tasks/code/01ref/07func_ref.cpp

69 lines
3 KiB
C++
Raw Normal View History

2022-09-01 16:37:41 +03:00
#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)
*/