Многопользовательские игры. Разработка сетевых приложений [Джошуа Глейзер] (pdf) читать постранично, страница - 117

Книга в формате pdf! Изображения и текст могут не отображаться!


 [Настройки текста]  [Cбросить фильтры]

ссылается на другую переменную. Следовательно, при изменении переменной-ссылки должна изменяться
оригинальная переменная. Чаще всего ссылки используются при определении
функций, которые изменяют свои параметры. Например, следующая функция
меняет значения параметров a и b местами:
void swap(int& a, int& b)
{
int temp = a;
a = b;
b = temp;
}

То есть если функции swap передать две целочисленные переменные, по завершении ее работы эти две переменные поменяются значениями. Это происходит
благодаря тому, что параметры a и b представляют собой ссылки на оригинальные
переменные. Если бы функцию swap потребовалось написать на C, пришлось бы
вместо ссылок использовать указатели. На уровне компиляции ссылки фактически
реализованы как указатели, но семантика использования ссылок намного проще,
потому что их разыменование происходит неявно. Кроме того, ссылки безопаснее
использовать в параметрах функций, потому что они гарантированно не могут
быть пустыми (хотя теоретически ничто не помешает написать уродливый код,
в котором ссылка будет пустой).

Константные ссылки
Возможность изменения параметров — лишь одна из множества причин использования ссылок. Для сложных типов (таких, как классы и структуры) передача по
ссылке почти всегда оказывается эффективнее передачи по значению. Это обу­
словлено необходимостью создания копии переменной при передаче по значению,
а для сложных типов, таких как вектор или строка, создание копии требует динамического выделения памяти, что значительно увеличивает накладные расходы.

354   Приложение • Современный С++

С другой стороны, если вектор или строка просто передаются в функцию по ссылке,
это означает, что функция сможет изменить значение оригинальной переменной.
А как быть, когда такая возможность должна быть запрещена, например когда
переменная представляет данные класса? Решение этой проблемы заключается
в использовании константных ссылок (const reference). Константная ссылка подобна обычной, но ее можно использовать только для чтения — любые изменения
запрещены. В результате получается соединение лучшего с хорошим: отпадает необходимость создания копии, и функция не сможет изменить данные. Следующая
функция print является одним из примеров передачи параметров по константной
ссылке:
void print(const std::string& toPrint)
{
std::cout