Справочник (программирование)

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

Определения

Указатели - это самая примитивная форма ссылки. Из-за их тесной связи с базовым оборудованием они являются одним из самых мощных и эффективных типов справочных материалов. Из - за это отношение, однако, указатели требуют сильного понимания деталей архитектуры памяти со стороны программиста . Поскольку указатели хранят адрес памяти непосредственно вместо значения, неправильное использование указателей может привести к неопределенному поведению в программе , особенно из-за висящих указателей или заполнителей. Умные указатели - это непрозрачные структуры данных, которые ведут себя как указатели, но к ним можно получить доступ только с помощью определенных методов. можно получить доступ.

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

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

Ссылки на C ++

В языке программирования C ++ ссылки используются очень часто и для различных целей:

  1. как (более короткий или более понятный) псевдоним для уже существующего объекта
  2. оптимизировать, чтобы избежать копий объектов
  3. в специальных функциях-членах, таких как конструкторы копирования и перемещения и операторы присваивания
  4. как так называемая универсальная ссылка (англ.: универсальная ссылка ), которая в шаблонах представляет произвольный тип параметра .

В C ++ есть так называемые ссылки Lvalue , которые идентифицируются добавлением к типу &, и (начиная с C ++ 11 ) дополнительные ссылки Rvalue , которые &&идентифицируются с помощью.

Примеры кода

Разница между ссылкой и копией:

int original = 5;
int kopie = original;
int& referenz = original;

kopie    = 30;  // weist der Kopie den Wert 30 zu. Das Original bleibt unverändert
referenz = 20;  // weist der Referenz – und somit auch dem Original – den Wert 20 zu
original = 10;  // ändert das Original, womit aber auch die Referenz ihren Wert ändert.

Передача параметров для справки :

void quadrieren(int& x) {
    x = x * x;
}

int main() {
    int i = 5;
    quadrieren(i);  // Funktionsaufruf ändert den Wert von i auf 25
}

Ссылки на объекты:

Bank& nBank = Bankenverzeichnis::nachBLZ("76543210");  // eine Referenz auf ein Bankobjekt wird beschafft
Konto& nKonto1 = nBank.kontoZugriff("1234567");        // eine Referenz auf ein bestimmtes Kontoobjekt wird beschafft
Konto& nKonto2 = nBank.kontoZugriff("1111111");        // eine Referenz auf ein weiteres Kontoobjekt wird beschafft
nKonto1.einzahlung(100.00, "EUR", nKonto2);            // eine Methode wird auf nKonto1 gerufen

Дизайн класса:

class Kunde
{
public:
    explicit Kunde(const std::string& name);  // 'name' wird aus Effizienzgründen nur als const-Referenz übergeben
    explicit Kunde(std::string&& name);       // Rvalue-Referenz, erlaubt ein "move" aus dem Namen (seit C++11)

    Kunde(const Kunde& other);  // Copy-Konstruktor
    Kunde(Kunde&& other);       // Move-Konstruktor (seit C++11)

    const std::string& getName() const;  // gibt const-Referenz auf Kundennamen zurück
    std::string&& getName() &&;  // gibt Rvalue-Referenz zurück, falls Objekt selbst ein RValue ist (ab C++11)

};

Пример на Паскале

Передача по ссылке (изменяется значение переданной переменной)

procedure quadriere(var wert: integer);
begin
    wert := wert * wert;
end;

В эту процедуру можно передать только переменную , а не выражение. wert- это локальное имя переменной, переданной как ссылка . При присвоении значения непосредственно изменяется содержимое передаваемой переменной.

Передача по значению (т.е. только значение, а не сама переменная; значение переданной переменной не изменяется)

function quadrat(wert: integer): integer;
begin
    Result := wert * wert;
end;

Даже если выделение из wertбудет иметь место, то это содержимое собранное из любых переменных не меняется: Передавать только одно значение . Идентификатор wert обозначает локальную переменную, которая только действует в пределах функции .