Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
тех прог.doc
Скачиваний:
37
Добавлен:
14.11.2019
Размер:
3.59 Mб
Скачать

10.7.Ссылки

Ссылка (reference) является альтернативным именем объекта. Пусть X некоторый тип, тогда ссылка на объект типа X объявляется с использованием X&. Например,

void f()

{

int i =1;

int& r = i; // r и i ссылаются на одно и то же целое

int x = r; // x = 1

r = 2; // i = 2

}

Ссылку всегда надо инициализировать, чтобы она ссылалась на какой-нибудь объект, например,

int i = 1;

int& r1 = i; // Правильно, r1 инициализирована

int& r2; // Ошибка, отсутствует инициализация

extern int& r3; // Правильно, r3 инициализируется в другом месте

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

Программа 28. Использование ссылок

В состав программы входит функция swap, меняющая значения своих аргументов, передаваемых в нее по ссылке, и функция max, возвращающая ссылку на максимальный из двух своих аргументов.

// Файл Referenc.cpp

void swap(int& a, int& b) // Обмен значений a и b

{

int tmp = a;

a = b;

b = tmp;

}

int& max(int& a, int& b) // Возвращает ссылку на максимальное из a и b

{

return a > b ? a: b;

}

#include <iostream.h>

#include <conio.h>

int main()

{

int x, y;

cout << "Введите два числа: ";

cin >> x >> y;

cout << "x = " << x << ", y = " << y << endl;

swap(x, y);

cout << "После обмена: \n";

cout << "x = " << x << ", y = " << y << endl;

max(x, y) = 0;

cout << "Максимальное обнулили: \n";

cout << "x = " << x << ", y = " << y << endl;

getch();

return 0;

}

Пример работы программы:

Введите два числа: 2 3

x = 2, y = 3

После обмена:

x = 3, y = 2

Максимальное обнулили:

x = 0, y = 2

При вызове функции swap ее параметры a и b инициализируются именами x и y, поэтому a и b становятся другими именами для переменных x и y, что и позволяет изменить x и y внутри функции.

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

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

10.8.Операторы new и delete

Оператор new выделяет память под объект во время выполнения программы. Например, пусть в программе определен указатель:

double *pd; // Указатель на double

Значение указателя pd после его создания не определено и его использование будет ошибкой. Инструкция:

pd = new double;

выделяет память под double, адрес которой присваивается pd. Теперь выделенную память можно использовать, например:

*pd = sqrt(3); // Размещение в памяти значения

cout << *pd; // Печать значения

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

Оператор delete освобождает память, выделенную ранее оператором new, например,

delete pd;

Теперь указатель pd можно использовать для других целей.

Память, освобожденная оператором delete, может быть повторно использована под объекты, создаваемые оператором new.

Динамические массивы можно создавать оператором new[]. Например, массив из 80 символов можно создать инструкцией:

char *s = new char[80];

Для удаления динамических массивов служит оператор delete[], например,

delete[] s; // Удаление массива s

При освобождении памяти, выделенной оператором new, операторы delete и delete[] должны иметь возможность определять размер удаляемого объекта. Это обеспечивается тем, что под динамический объект памяти выделяется больше, чем под статический, обычно на одно слово, в котором хранится размер объекта.