C++ Ссылка
Ссылочная переменная — это псевдоним, то есть другое имя для уже существующей переменной.
После инициализации ссылки переменной вы можете использовать имя ссылки или имя переменной для обращения к переменной.
Ссылка должна быть инициализирована при определении, и после привязки к переменной она не может быть привязана к другой переменной.
Синтаксис ссылок выглядит следующим образом:
int a = 10; int &ref = a; // ref 是 a 的引用
int &refПредставляетrefявляетсяintСсылка на тип.refДаaпсевдоним для,refОперация напрямую воздействует наa。
Ссылки и указатели в C++
Ссылки легко спутать с указателями; между ними есть три основных различия:
- Нулевых ссылок не существует; ссылка должна быть связана с допустимым участком памяти.
- После инициализации ссылки объектом её нельзя направить на другой объект. Указатель может указывать на другой объект в любое время.
- Ссылка должна быть инициализирована при создании. Указатель может быть инициализирован в любое время.
- Объект, на который ссылается ссылка, должен быть переменной, а указатель — адресом.
| Особенности | Ссылка | Указатель |
|---|---|---|
| Определение и инициализация | Должна быть инициализирована и не может бытьnull。 | Его можно оставить неинициализированным, он может указывать на другие объекты в последующем коде, а также может бытьnull。 |
| Синтаксис | Использование&Объявление, например:int &ref = a; | Использование*Объявление, например:int *ptr = &a; |
| перепривязка | Её нельзя перепривязать; после инициализации она всегда ссылается на один и тот же объект. | Можно переназначить, чтобы он указывал на другой объект, например:ptr = &b; |
| Нулевое значение (допустимость null) | не может бытьnull, должна быть привязана к допустимому объекту. | может бытьnull, что означает, что он не указывает ни на какой объект. |
| Использование памяти | Она не занимает дополнительную память (компилятор обычно оптимизирует её для непосредственной работы с объектом, на который она ссылается). | Он занимает дополнительную память (хранит адрес, обычно одно машинное слово, например, 4 байта или 8 байт). |
| Способ доступа | Она используется напрямую, без необходимости в операторе разыменования, например:ref = 10; | нужно использовать*Используйте оператор разыменования для доступа или изменения объекта, на который указывает указатель, например:*ptr = 10; |
| Многоуровневая косвенность | Она не поддерживает несколько уровней косвенности (не может быть ссылки на ссылку). | Он поддерживает несколько уровней косвенности (например, указатель на указатель:int **pptr;)。 |
| Передача параметров в функцию | Она часто используется для передачи параметров в функцию, с кратким синтаксисом, например:void func(int &x) { x = 10; } | Он также может использоваться для передачи параметров в функцию, но требует оператора разыменования, например:void func(int *x) { *x = 10; } |
| Массивы и ссылки | Нельзя напрямую создать массив ссылок, но можно создать ссылку на массив, например:int (&ref)[10] = arr; | Можно создать массив указателей, а также можно создать указатель на массив, например:int *ptrArr[10]; |
| Безопасность | Безопаснее не бываетnull, а синтаксис более интуитивен. | Он более гибок, но чреват ошибками (например, нулевые указатели, висячие указатели и т. д.). |
| Внутренняя реализация | Обычно она реализуется через указатели, но компилятор оптимизирует её так, чтобы напрямую работать с объектом, на который она ссылается. | Напрямую хранит адрес памяти целевого объекта. |
Создание ссылок в C++
Представьте имя переменной как метку, прикреплённую к переменной в её ячейке памяти. Можно рассматривать ссылку как вторую метку, прикреплённую к переменной в её ячейке памяти. Поэтому доступ к содержимому переменной можно получить как через исходное имя переменной, так и через ссылку. Например:
int i = 17;
Мы можем объявить переменную-ссылку для i следующим образом:
int& r = i; double& s = d;
В этих объявлениях,&читается какСсылка。
Следовательно, первое объявление можно прочитать как"r — это ссылка на целое число, инициализированная значением i", второе объявление можно прочитать как"s — это ссылка типа double, инициализированная значением d"。
В следующем примере используются ссылки на int и double:
Пример
Когда приведенный выше код скомпилирован и выполнен, он выдает следующие результаты:
Value of i : 5 Value of i reference : 5 Value of d : 11.7 Value of d reference : 11.7
Ссылки обычно используются для списков параметров функций и возвращаемых значений функций. Ниже перечислены две важные концепции, связанные со ссылками в C++, которые программисты C++ должны четко понимать:
| Концепции | Описание |
|---|---|
| Передача ссылок в качестве параметров | C++ поддерживает передачу ссылок в функции в качестве параметров, что безопаснее, чем передача обычных параметров. |
| Использование ссылок в качестве возвращаемых значений | Ссылку можно возвращать из функции C++, как и другие типы данных. |