Помогите разобраться с ссылками в C++
В книгах по C++ указано, что ссылка перед использованием должна быть инициализирована обьектом, на который она ссылается, в противном случае компилятор выдает ошибку:
int &link;// Ошибка`
Почему тогда, если ссылка обьявлена в качестве аргумента функции и не инициализирована обьектом, то ошибки нет?
int sum(int &a, int &b) {
return (a + b);
}
Ответы (2 шт):
В комментариях уже много сказали, но стоит обобщить.
Вообще, то что вы спрашиваете немного разные вещи.
- Это alias(псевдоним) и тут вполне логично, что он не может не быть определен, тут . никакой путаницы нету.
- Это передача аргумента в функцию(по значению, по ссылке, по указателю). Другими словами это не псевдоним как было раньше, а говорит компилятору, что не нужно делать копию аргумента передаваемого в функцию, а возьми просто это по адресу в памяти. Затем, когда вы вызываете функцию и происходит инициализация и можно сказать создание псевдонима которая указывает на это место в памяти.
Выражаясь более-менее формальным языком, инициализация параметров функции происходит в момент её вызова с помощью аргументов, использованных в месте её вызова, либо аргументов по-умолчанию, если таковые существуют.
Ссылки без инициализации могут встречаться только в следующих случаях:
Параметры функций:
int sum(int &a, int &b);
Тип данных возвращаемых функцией:
int & get_num();
Объявление члена класса:
struct Test
{
int & num;
};
При использовании спецификатора extern:
extern int & var;