Что такое ссылка в программировании
Перейти к содержимому

Что такое ссылка в программировании

  • автор:

Ссылка (C++)

В языке программирования C++ ссылка — это простой ссылочный тип, менее мощный, но более безопасный, чем указатель, унаследованый от языка Си. Название C++ ссылка может приводить к путанице, так как в информатике под ссылкой понимается обобщенный концептуальный тип, а указатели и С++ ссылки являются специфическими реализациями ссылочного типа.

Введение

Если мы объявили переменную без спецификатора extern, то для хранения значений выделяется память. Чтобы изменить или прочитать значение переменной (то есть значение находящейся в этой области памяти), мы обращаемся по имени этой переменной. В языке C имя сущности (переменной, типа, функции и т.д.) — это идентификатор. С точки зрения программиста, объявляя ссылку (или же указывая, что она будет возвращаемым значением или аргументом функции), мы задаём альтернативный идентификатор для уже созданного объекта. В языке C ссылок нет. С точки зрения реализации, ссылка — это, по сути, указатель, который жестко привязан к области памяти, на которую он указывает, и который автоматически разыменовывается, когда мы обращаемся по имени ссылки (это легко проверить, дизассемблируя простой пример).

/* конкретные адреса переменных могут быть другими */ int a; //переменная с именем "a" типа int размещена по адресу 0xbfd86d6c int &ra = a; //задано альтернативное имя (ra) для переменной по адресу 0xbfd86d6c /* символ "&" используемый для уже созданного объекта является операцией взятия адреса * * (и эта операция не есть ссылка), то есть &a тут означает получить адрес переменной * * к которому привязано имя "a" */ cout  &a  '\n'  &ra  '\n'; 

В stdout будет записано:

То есть оба имени «a» и «ra» привязаны к одному и тому же адресу.

Ссылки нельзя объявлять без привязки к переменной (то есть не инициализировав при объявлении). После объявления ссылки её невозможно привязать к другой переменной.

Важно отличать ссылки от оператора взятия адреса & (address of). Оператор взятия адреса используется для уже созданного объекта с целью получить его адрес (то есть адрес области памяти, где хранятся значения), а ссылка это только задание альтернативного имени объекта (с точки зрения программиста, а не реализации). Например:

int a; //переменная типа int размещена по адресу 0xbfd86d6c с именем "a" int b = 3; /* создан указатель с именем "p" по адресу 0xbf971c4c, значение этого указателя * * адрес объекта с именем "a" - 0xbfd86d6c (это значение можно будет менять) */ int *p = &a; p = &b; //присваиваем указателю новое значение соответствующее адресу переменной "b" 

Отличие указателя от ссылки в том, что получить само значение переменной, на который указывает указатель, можно только выполнив операцию разыменовывания * (символ «*» в объявлении является объявлением указателя, а при применении к уже созданной переменной является оператором разыменовывания). Например:

int a = 3; int *p = &a; //объявили, создали, и инициализировали объект // здесь к уже созданному объекту с именем "p" применяется оператор "*", который означает // считать значение из "p", которое является адресом и далее считать данные по этому адресу cout  *p  '\n'; 

В stdout будет записано:

Синтаксис и терминология

где — тип и — идентификатор, указывает идентификатор, чьим типом является ссылка на .

  1. int A = 5;
  2. int& rA = A;
  3. extern int& rB;
  4. int& foo ();
  5. void bar (int& rP);
  6. class MyClass < int& m_b; /* . */ >;
  7. int funcX() < return 42 ; >; int (&xFunc)() = funcX;

Здесь, rA и rB являются типами «ссылок на int », foo() — функция, возвращающая ссылку на int , bar() — функция с ссылкой в качестве параметра, которая ссылается на int , MyClass — класс ( class ) с членом, ссылающимся на int , funcX() — функция, возвращающая int , xFunc() — псевдоним для funcX .

Типы, относящиеся к «ссылка на », иногда называются ссылочными типами. Идентификаторы ссылочного типа называются ссылочными переменными. Называть их переменными в строгом смысле будет неправильно (показано дальше).

Связь с указателями

C++ ссылки отличаются от указателей несколькими особенностями:

  • Невозможно ссылаться напрямую на объект ссылочного типа после его определения; каждое упоминание его имени напрямую представляет объект, на который он ссылается.
  • В качестве результата первого указания не могут быть выполнены никакие арифметические вычисления, приведения типов, взятия адреса и т.п.
  • После создания ссылки ее нельзя перевести на другой объект; в таких случаях говорят, не может быть переопределена. Это часто делают с указателями.
  • Ссылки не могут быть null (т.е.указывать в никуда), тогда как указатели — могут; каждая ссылка ссылается на некий объект, вне зависимости от его корректности.
  • Ссылки не могут быть неинициализированными. Так как невозможно переинициализировать ссылку, она должна быть инициализирована сразу после создания. В частности, локальные и глобальные переменные должны быть проинициализированы там же, где они определены, а ссылки, которые являются данными-членами сущностей класса, должны быть инициализированы в списке инициализатора конструктора класса.

int& k; // компилятор выдаст сообщение: ошибка: ‘k’ declared as reference but not initialized (‘k’ объявлена как ссылка, но не инициализирована)

Существует простое преобразование между указателями и ссылками: операция взятия адреса ( & ) получает указатель, ссылающийся на тот же самый объект при переходе по ссылке, а ссылка, которая инициализирована при разыменовании ( * ) указателя будет указывать на тот же объект, что и указатель, где это возможно без неопределенного поведения. Эта тождественность — отражение типичной реализации, которая весьма эффективно превращает ссылки в указатели, которые неявно разыменовываются при каждом использовании.

Как следствие — во многих реализациях работа с переменными с автоматическим или статическим жизненным циклом по ссылке, хоть синтаксически и похожа на прямой доступ, может вызвать скрытые разыменования с дополнительными расходами.

Кроме того, из-за ограничения операций над ссылками, они намного легче в понимании, чем указатели, а также более защищены от ошибок. Тогда как указатели могут стать некорректными благодаря множеству причин, начиная с указания на null-значения и выходов за границы и до использования недопустимых приведений типов, ссылка может стать некорректной лишь в двух случаях:

  • Если она ссылается на объект с автоматическим размещением в памяти, с завершившимся временем жизни,
  • Если она ссылается на объект, находящийся в блоке динамической памяти, который был освобожден.

Первый вариант легко обнаруживается автоматически если ссылка имеет статическое размещение, но возникают проблемы, если ссылка — член динамически размещенного объекта; от второго защищаться сложнее. Это единственный недостаток ссылок, который может быть нивелирован при разумной политике выделения памяти.

Применение ссылок

  • Помимо удобной замены указателям, еще одним полезным применением ссылок являются списки параметров функции, при помощи которых они могут передавать параметры, используемые для вывода без явного взятия адреса вызывающим. Например:
void square(int x, int& result)  result = x * x; > 

Тогда следующий вызов поместит 9 в y:

square(3, y); 

Тем не менее, следующий вызов приведет к ошибке компиляции, так как только параметры ссылки, не помеченные const , могут быть адресуемыми значениями:

square(3, 6); 
  • Возврат ссылки также позволяет непредусмотренный синтаксис, в котором вызовы функции могут быть присвоены:
int& preinc(int& x)  ++x; return x; > preinc(y) = 5; // то же, что и ++y, y = 5 
  • Во многих реализациях, обычные механизмы передачи параметров часто подразумевают весьма затратную операцию копирования больших параметров. Ссылки, помеченные const , полезны в качестве способа передачи больших объектов между функциями без накладных расходов:
void f_slow(BigObject x)  /* . */ > void f_fast(const BigObject& x)  /* . */ > BigObject y; f_slow(y); // медленно, копирует y в параметр x f_fast(y); // быстро, дает прямой доступ к y (только для чтения) _

Если f_slow() действительно требует собственной копии x для модификации, то она должна создать копию явным образом. Тогда как тот же способ может быть применен с использованием указателей, что вызовет модификацию каждого вызова функции, добавив громоздкий оператор взятия по адресу ( & ) в качестве аргумента, причем довольно сложно будет отменить изменения, если объект становится меньше.

  • Причиной введения ссылок в язык С++ в основном являлась необходимость перегрузки операторов, применяемых к объектам пользовательских типов (классов). Как упоминалось выше, передача по значению громоздких объектов в качестве операндов вызывала бы лишние затраты на их копирование. С другой стороны, передача операндов по адресу с использованием указателей, приводит к необходимости взятия адресов операндов в выражениях. Например:
class BigClass  //. friend BigClass operator-(BigClass* left, BigClass* right); //. >; BigClass x, y, z; //. x = &y - &z; 

Однако, выражение &y — &z уже имело определённый смысл в языке С.

Цитаты

Ссылки определены стандартом ISO C++ следующим образом (исключая раздел примеров):

В объявлении T D, где D имеет вид

а типом идентификатора в объявлении T D1 является производный тип («derived-declarator-type-list) T ,” тогда типом идентификатора D будет производная (“derived-declarator-type-list) ссылка на T .” Cv-ссылки являются плохо согласованными, исключая ситуацию, когда cv-квалификаторы (от англ. const («константный») и volatile («временный»)) представлены через использование typedef (7.1.3) или шаблон аргумента типа (14.3), в случае чего игнорируются cv-квалификаторы. [Пример: в коде

typedef int& A; const A aref = 3; // плохо согласовано; // неконстантная ссылка инициализируется rvalue 

тип aref является “ссылкой на int ”, а не “ const ссылается на int ”. ] [Примечание: ссылка может восприниматься как имя объекта. ] Объявление, указывающее тип “ссылается на cv void”, некорректно.

Это не определяет, требуется ли ссылке выделение памяти (3.7).

Не должно быть ссылок на ссылки, массивов ссылок, а также указателей на ссылки. Объявление ссылки должно содержать инициализатор (8.5.3), за исключением случая, когда объявление содержит явный указатель extern (7.1.1) — объявление члена класса (9.2) внутри объявления класса, объявление параметра или возврат типа (8.3.5); смотри 3.1. Ссылка должна при инициализации ссылаться на корректный объект или функцию. [Примечание: точнее говоря, ссылка на null не может существовать в корректно написанной программе, так как единственным способом создать подобную ссылку является связывание ее с «объектом», полученном при помощи разыменования нуль-указателя, что вызывает неопределенное поведение. Как описано в 9.6, ссылка не может ограничиваться напрямую битовым полем. ] | cite = ISO/IEC 14882:1998(E), стандарт ISO C++, раздел 8.3.2 [dcl.ref]

См. также

Дополнительные источники

  • Ссылки в кратком FAQ по C++ (англ.)
  • Простые C++ Указатели и Ссылки (англ.)

Wikimedia Foundation . 2010 .

  • Ссуз
  • Стаб (распределенные вычисления)

Полезное

Смотреть что такое «Ссылка (C++)» в других словарях:

  • ссылка — 1. ССЫЛКА, и; мн. род. лок, дат. лкам; ж. 1. к Сослать ссылать. Приговорить к ссылке в Сибирь. Это преступление каралось ссылкой на каторжные работы. 2. Пребывание на поселении в качестве ссыльного; время такого пребывания. Отбывать ссылку. Место … Энциклопедический словарь
  • ссылка — См. доказательство делать ссылку. Словарь русских синонимов и сходных по смыслу выражений. под. ред. Н. Абрамова, М.: Русские словари, 1999. ссылка замечание, примечание, справка, упоминание, сноска; высылка, депортация; доказательство;… … Словарь синонимов
  • Ссылка — словесное или цифровое указание внутри издания, адресующее читателя к другому изданию (библиогр. ссылка); к фрагменту текста, где содержатся дополняющие, расширяющие или поясняющие сведения о предмете речи в данном текстовом фрагменте; к… … Издательский словарь-справочник
  • ССЫЛКА — вид уголовного наказания, состоит в удалении осужденного из места его жительства с обязательным поселением в определенной местности. В России применялись по суду или в административном порядке (см. Административная ссылка), главным образом в… … Юридический словарь
  • ССЫЛКА — вид уголовного наказания удаление осужденного из места его жительства с обязательным поселением в определенной местности. В России применялись по суду или в административном порядке (см. Административная ссылка), главным образом в отношении лиц,… … Большой Энциклопедический словарь
  • ССЫЛКА — ССЫЛКА, вид уголовного наказания удаление осуждённого из места его жительства с обязательным поселением в определённой местности. В России сложилась в 16 17 вв., наибольшее распространение получила в 19 нач. 20 вв., применялась по суду или в… … Русская история
  • Ссылка — вид уголовного наказания удаление осужденного из места его жительства с обязательным поселением в определенной местности. В России применялись по суду или в административном порядке (см. Административная ссылка), главным образом в отношении лиц,… … Политология. Словарь.
  • ССЫЛКА — вид уголовного наказания, состоящий в удалении осужденного из места его жительства с обязательным поселением в определенной местности. В России С. применялись по решению суда или в административном порядке (АДМИНИСТРАТИВНАЯ ССЫЛКА), главным… … Юридическая энциклопедия
  • ССЫЛКА — 1. ССЫЛКА1, ссылки, жен. 1. только ед. Действие по гл. сослать ссылать. Царское правительство широко применяло ссылку революционеров в Сибирь. 2. Состояние, как результат этого действия. Приговорить к ссылке. Жить в ссылке. Сослать в ссылку.… … Толковый словарь Ушакова
  • ССЫЛКА — 1. ССЫЛКА1, ссылки, жен. 1. только ед. Действие по гл. сослать ссылать. Царское правительство широко применяло ссылку революционеров в Сибирь. 2. Состояние, как результат этого действия. Приговорить к ссылке. Жить в ссылке. Сослать в ссылку.… … Толковый словарь Ушакова
  • ссылка — ССЫЛКА, и, жен. 1. см. сослать. 2. Пребывание ссыльного на поселении, а также время такого пребывания. Жить в ссылке. II. ССЫЛКА, и, жен. 1. см. сослаться. 2. Выдержка из текста или указание источника, на к рый ссылаются. С. на первоисточник. С.… … Толковый словарь Ожегова
  • Обратная связь: Техподдержка, Реклама на сайте
  • �� Путешествия

Экспорт словарей на сайты, сделанные на PHP,
WordPress, MODx.

  • Пометить текст и поделитьсяИскать в этом же словареИскать синонимы
  • Искать во всех словарях
  • Искать в переводах
  • Искать в ИнтернетеИскать в этой же категории

Ссылка (программирование)

Информация должна быть проверяема, иначе она может быть поставлена под сомнение и удалена.
Вы можете отредактировать эту статью, добавив ссылки на авторитетные источники.
Эта отметка установлена 14 мая 2011.

У этого термина существуют и другие значения, см. Ссылка.

Ссылка в программировании — это объект, указывающий на определенные данные, но не хранящий их. Получение объекта по ссылке называется разыменованием.

Ссылка не является указателем, а просто является другим именем для объекта.

В языках программирования ссылка может быть реализована как переменная, содержащая адрес ячейки памяти. В некоторых языках высокого уровня также имеется возможность использовать ссылки на объекты при передаче объектов в подпрограмму и из подпрограммы.

Примеры реализаций ссылок

C++

Ссылки в C++ должны быть связаны с каким-либо объектом. Таким образом, «нулевые ссылки» (не связанные с каким-либо объектом), в C++ отсутствуют. Разыменование ссылок в C++ не требует специального оператора. Таким образом, в C++ ссылки — форма передачи адреса в стек напрямую, минуя копирование и указатели.

В следующем примере параметр x передаётся по значению, а y — по ссылке. Результат работы функции помещается в y:

#include using namespace std; // без этой записи нам бы пришлось дописывать "std::" к cout и endl void square(int x, int &result)  result = x*x; > int main()  int y = 0; //Инициализация square(3, y); cout  <"y sy1">  ; //y=9 return 0; > 

Java и C#

В этих языках понятие указателя отсутствует, а вместо него используется понятие ссылки. Разыменование ссылок и взятие адресов объектов для присваивания их ссылкам не требует специального оператора.

PHP

Ссылки в PHP — это средство доступа к содержимому одной переменной под разными именами. Они не похожи на указатели C и не являются псевдонимами таблицы символов. В PHP имя переменной и её содержимое — это разные вещи, поэтому одно содержимое может иметь разные имена. Ближайшая аналогия — имена файлов Unix и файлы — имена переменных являются элементами каталогов, а содержимое переменных это сами файлы. Ссылки в PHP — аналог жёстких ссылок (hardlinks) в файловых системах Unix.

 $a = 'text'; $b =& $a; print $b.'
'
; $a = 5; print $b.'
'
; ?>
text 5

См. также

  • Передача параметра (программирование)#Передача параметра по ссылке
  • Ссылки в C++
  • Гиперссылка

Адрес • Ссылка

Логический • Низший тип • Коллекция • Перечисляемый тип • Исключение • First-class function • Opaque data type • Recursive data type • Семафор • Поток • Высший тип • Type class • Unit type • Void

Абстрактный тип данных • Структура данных • Интерфейс • Kind (type theory) • Примитивный тип • Subtyping • Шаблоны C++ • Конструктор типа • Parametric polymorphism

Пожалуйста, улучшите статью в соответствии с правилами написания статей.

  • Типы данных

Wikimedia Foundation . 2010 .

Полезное

Смотреть что такое «Ссылка (программирование)» в других словарях:

  • Программирование основанное на прототипах — Прототипное программирование стиль объектно ориентированного программирования, при котором отсутствует понятие класса, а повторное использование (наследование) производится путём клонирования существующего экземпляра объекта прототипа.… … Википедия
  • Параметр (программирование) — У этого термина существуют и другие значения, см. Параметр (значения). Параметр в программировании принятый функцией аргумент. Термин «аргумент» подразумевает, что конкретно и какой конкретной функции было передано, а параметр в каком качестве… … Википедия
  • Передача параметра (программирование) — Передача параметра возможна по значению и по ссылке. Иногда также используют выражение передача параметра по адресу . Ниже приведён пример, иллюстрирующий различия этих способов. #include using namespace std; // для использования… … Википедия
  • Субъектно-ориентированное программирование — Парадигмы программирования Агентно ориентированная Компонентно ориентированная Конкатенативная Декларативная (контрастирует с Императивной) Ограничениями Функциональная Потоком данных Таблично ориентированная (электронные таблицы) Реактивная … Википедия
  • Класс (программирование) — У этого термина существуют и другие значения, см. Класс. Класс в программировании набор методов и функций. Другие абстрактные типы данных метаклассы, интерфейсы, структуры, перечисления характеризуются какими то своими, другими… … Википедия
  • Прототипное программирование — Для термина «Прототип» см. другие значения. Парадигмы программирования Агентно ориентированная Компонентно ориентированная Конкатенативная Декларативная (контрастирует с Императивной) Ограничениями Функциональная Потоком данных Таблично… … Википедия
  • Интерфейс (объектно-ориентированное программирование) — У этого термина существуют и другие значения, см. Интерфейс (значения). Интерфейс (от лат. inter «между», и face «поверхность») семантическая и синтаксическая конструкция в коде программы, используемая для специфицирования… … Википедия
  • Событие (объектно-ориентированное программирование) — У этого термина существуют и другие значения, см. Событие. Событие в объектно ориентированное программировании это сообщение, которое возникает в различных точках исполняемого кода при выполнении определённых условий. События предназначены для… … Википедия
  • заводское программирование — 05.02.15 заводское программирование [ factory programming]: Запись данных на радиочастотную метку в процессе ее производства, которые будут доступны только для считывания. Сравнить с терминологической статьей «программирование по месту… … Словарь-справочник терминов нормативно-технической документации
  • Объект (программирование) — У этого термина существуют и другие значения, см. Объект (значения). Объект в программировании некоторая сущность в виртуальном пространстве, обладающая определённым состоянием и поведением, имеющая заданные значения свойств (атрибутов) и… … Википедия
  • Обратная связь: Техподдержка, Реклама на сайте
  • �� Путешествия

Экспорт словарей на сайты, сделанные на PHP,
WordPress, MODx.

  • Пометить текст и поделитьсяИскать в этом же словареИскать синонимы
  • Искать во всех словарях
  • Искать в переводах
  • Искать в ИнтернетеИскать в этой же категории

Что такое ссылка в программировании

« Предыдущий вопрос

Основной операцией над указателем является разыменование, т. е. ссылка на объект, на который

например +79131234567

jar—> txt fb2 ePub html

на телефон придет ссылка на файл выбранного формата

Шпаргалки на телефон — незаменимая вещь при сдаче экзаменов, подготовке к контрольным работам и т.д. Благодаря нашему сервису вы получаете возможность скачать на телефон шпаргалки по информатике (программированию). Все шпаргалки представлены в популярных форматах fb2, txt, ePub , html, а также существует версия java шпаргалки в виде удобного приложения для мобильного телефона, которые можно скачать за символическую плату. Достаточно скачать шпаргалки по информатике (программированию) — и никакой экзамен вам не страшен!

Сообщество

Не нашли что искали?

Если вам нужен индивидуальный подбор или работа на заказа — воспользуйтесь этой формой.

C++ обладает небольшим, но гибким набором различных видов операторов для контроля потока упра

Ссылка

Ссылка – это другое имя объекта. Главное применение ссылок заключается в спецификации операций для типов, определяе-мых пользователем. Их можно также применять как параметры функции. Запись x& представляет собой ссылку на x.

int& r = i; // r и i теперь ссылаются на один int int x = r // x = 1 r = 2; // i = 2;

Ссылке следует быть инициализированной.

В большинстве машин можно обращаться к объектам намного быстрее, когда они помещены в регистр. В идеальном случае компилятор сам определяет оптимальную стратегию применения всех возможностей, доступных на машине, для которой компилируется программа. Но это не простая задача, поэтому иногда необходимо дать подсказку компилятору. Это осуществляется с помощью описания объекта как register.

register int i; register point cursor; register char* p;

Описание register применяют только тогда, когда эффективность действительно важна. C++ позволяет записать значения основных типов: символьных кон32б стант, целых констант и констант с плавающей точкой. Также ноль (0) может применяться как константа любого указательного типа, и символьные строки служат константами типа char[]. Можно также определить символические константы. Символическая константа представляет собой имя, значение которого нельзя изменить в его области видимости. В C++ существует три вида символических констант:

1) любому значению любого типа можно присвоить имя и использовать его как константу, добавив к его описанию ключевое слово const;

2) множество целых констант может быть задано как перечисление;

3) любое имя вектора или функции является константой.

При программировании нетривиальных разработок приходит момент, когда необходимо иметь больше пространства памяти, чем имеется или отпущено. Существует два способа получить побольше пространства из того, что доступно:

1) помещение в байт более одного небольшого объекта;

2) применение одного и того же пространства для хранения разных объектов в разное время. Первое можно осуществить с помощью применения полей, второе – объединений.

Ссылки в С++

Ссылки – особый тип данных, являющийся скрытой формой указателя, который при использовании автоматически разименовывается. Ссылка может быть объявлена как другим именем, так и как псевдоним переменной, на которую ссылается.

// структура объявления ссылок /*тип*/ &/*имя ссылки*/ = /*имя переменной*/;

При объявлении ссылки перед её именем ставится символ амперсанда & , сама же ссылка должна быть проинициализирована именем переменной, на которую она ссылается. Тип данных, на который указывает ссылка, может быть любым, но должен совпадать с объектом, на который ссылается, то есть с типом данных ссылочной переменной. Для удобства, будем называть переменную, на которую ссылается ссылка «ссылочной переменной». Любое изменение значения содержащегося в ссылке повлечёт за собой изменение этого значения в переменной, на которую ссылается ссылка. Разработаем программу, в которой объявим ссылку на объект типа int .

// №1.cpp: определяет точку входа для консольного приложения. #include "stdafx.h" #include using namespace std; int main(int argc, char* argv[]) < int value = 15; int &reference = value; // объявление и инициализация ссылки значением переменной value cout 
// №1.cpp: определяет точку входа для консольного приложения. #include using namespace std; int main(int argc, char* argv[]) < int value = 15; int &reference = value; // объявление и инициализация ссылки значением переменной value cout 

В строке 10 объявлена ссылка reference типа int на переменную value . В строке 13 суммируется значение переменной value с числом 15, через ссылку reference . Результат работы программы смотреть на рисунке 1.

CppStudio.com

value = 15 reference = 15 value = 30 reference = 30 Для продолжения нажмите любую клавишу . . .

Рисунок 1 — Ссылки в С++

Просмотрев результат работы программы можно сказать, что через ссылку меняется значение ссылочной переменной. Таким образом, сама ссылка не имеет как таковой копии значения взятой у переменной при инициализации ссылки, а всего лишь ссылка ссылается на ссылочную переменную посредством её адреса.

Ссылки, как правило, в большинстве случаев используют в функциях как ссылки-параметры или ссылки-аргументы. Напомню, что в языке программирования С++ в функции передаются данные по значению и по ссылке. Так вот, когда происходит передача по значению, те данные, которые необходимо передать, нужно сначала скопировать, а когда передаётся большой объём данных, то только на передачу затрачивается большое количество времени и ресурсов. В таком случае необходимо использовать передачу по ссылке, в этом случае данные копировать нет необходимости, так как к ним обеспечен прямой доступ, но нарушают безопасность данных, хранимых в ссылочных переменных, так как открывают прямой доступ к этим данным. Хотя далее мы рассмотрим, как обеспечить целостность данных и скорость их передачи. Для этого, разработаем программу, в которой создадим три функции, аргументы в которых будут передаваться по значению и по ссылке. Вдобавок ко всему этому ещё и передачу через указатель осуществим. Частенько возникает путаница между указателями и ссылками, на первый взгляд и ссылки и указатели работают одинаково, но разница все, же есть и весьма значительная.

// reference.cpp: определяет точку входа для консольного приложения. #include "stdafx.h" #include using namespace std; int sum_by_value(int );// суммирование по значению int sum_by_reference(int &);// суммирование по ссылке int sum_by_pointer(int *); // суммирование по указателю int _tmain(int argc, _TCHAR* argv[]) < int value = 10; cout int sum_by_value(int value)// функция принимающая аргумент по значению < value += value; return value; >int sum_by_reference(int &reference) // функция принимающая аргумент по ссылке < reference += reference; return reference; >int sum_by_pointer(int *ptrvalue)// функция принимающая аргумент через указатель < *ptrvalue += *ptrvalue;// арифметика с указателем return *ptrvalue; >
// reference.cpp: определяет точку входа для консольного приложения. #include using namespace std; int sum_by_value(int );// суммирование по значению int sum_by_reference(int &);// суммирование по ссылке int sum_by_pointer(int *); // суммирование по указателю int main() < int value = 10; cout int sum_by_value(int value)// функция принимающая аргумент по значению < value += value; return value; >int sum_by_reference(int &reference) // функция принимающая аргумент по ссылке < reference += reference; return reference; >int sum_by_pointer(int *ptrvalue)// функция принимающая аргумент через указатель < *ptrvalue += *ptrvalue;// арифметика с указателем return *ptrvalue; >

Начальное значение осталось неизменным в случае передачи по значению, тогда как передача по ссылке и через указатель изменили значение передаваемой переменной. Таким образом, нет необходимости использовать глобальные переменные при необходимости изменения значения передаваемой переменной, нужно воспользоваться ссылкой или указателем. В случае использования указателя строка 18 нельзя забывать про операцию взятия адреса, так как аргументом является указатель. В случае со ссылкой, достаточно указать только имя переменной и всё строка 16. Результат работы программы показан на рисунке 2.

CppStudio.com

sum_by_value = 20 value = 10 sum_by_reference = 20 value = 20 sum_by_pointer = 40 value = 40 Для продолжения нажмите любую клавишу . . .

Рисунок 2 — Ссылки в С++

В чём же разница между указателями и ссылками? Основное назначение указателя – это организация динамических объектов, то есть размер, которых может меняться (увеличиваться или уменьшаться). Тогда как ссылки предназначены для организации прямого доступа к тому, или иному объекту. Главное отличие состоит во внутреннем механизме работы. Указатели ссылаются на участок в памяти, используя его адрес. А ссылки ссылаются на объект, по его имени (тоже своего рода адрес). Если нет необходимости изменить передаваемое значение в ссылочной переменной, но нужно выиграть в скорости, используйте спецификатор const в объявлении параметров функций. Только так и можно защитить данные от случайного их изменения или полной потере.

int sum_by_reference(const int &reference) // функция принимающая аргумент по ссылке // квалификатор const не даёт изменить передаваемый аргумент внутри функции

К сожалению, для данной темы пока нет подходящих задач. Если у вас есть таковые на примете, отправте их по адресу: admin@cppstudio.com. Мы их опубликуем!

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *