В языке C++ появился новый механизм работы с переменными — ссылки. Функция swap() работала правильно, только не слишком удобно применять постоянное разыменование указателей.
С помощью ссылок функция swap() может выглядеть аккуратнее.
void swap(int& a, int& b)
{
int temp = a;
a = b;
b = temp;
}
Т.к. ссылка является синонимом имени переменной, то вызов функции будет выполнен без взятия адреса переменных:
swap(x, y);
Конструкция int& объявляет ссылку на переменную типа int. При таком объявлении функции в стек будут положены не значения переменных, а их адреса.
Ссылка — это указатель, с которым можно работать, как с обычной переменной. Важные отличия ссылки от указателя заключаются в следующем:
· Ссылка должна быть проинициализирована.
· Ссылка не может быть равна NULL.
Для взятия адреса переменной и для объявления ссылки используется одинаковый символ — & (амперсанд). Понять, чем является & в каждом конкретном случае несложно, если помнить следующее правило:
Если & используется при объявлении переменной, то такая переменная будет являться ссылкой. Во всех остальных случаях (кроме логических операций) & будет означать взятие адреса от переменной.
|
|
На начальном этапе за рамками рассмотрения остается приведение типов ссылок (приведение ссылочных типов может привести к генерации исключения).
Примеры:
int x; //объявление переменной целого типа
int* p; //объявление указателя на переменную целого типа
int& r = x; // объявление ссылки на значение целого типа
int* &rp = p; // объявление ссылки на указатель, указывающий на переменную целого типа
int& rr; // ошибка компиляции. Ссылка должна быть проинициализирована
p = &x; //присвоить p адрес переменной x
x = *p; //присвоить x значение, которое находится по адресу, сохраненному в p
Возможен и такой вариант:
int *p; // объявление неинициализированного указателя на переменную целого типа
int **pp = &p; // объявление указателя на указатель и инициализация его адресом, по которому
//размещен указатель p
Логические операции:
(a == 0) && (b!=0) - логическое И
(a & b) - побитовая операция И (пример: a = 01010101; b = 00001111; a & b = 00000101)