Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Язык программирования С++ и его «подводные камни».DOC
Скачиваний:
39
Добавлен:
01.05.2014
Размер:
1.02 Mб
Скачать

1.5. Ссылки

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

double dVar; // Определяет переменную типа double

double &rdVar = dVar; // Определяет ссылку типа double

Такая переменная при определении должна быть обязательно проинициализирована.

Наиболее очевидным применением ссылок является обеспечение передачи функции адреса вместо самой переменной (иногда это называется передачей параметра по ссылке), что позволяет избежать копирования параметров, пе­редаваемых функции в качестве аргументов, в стек:

struct BigStruct {

int array[1000];

} stObject;

void Func1 (BigStruct bs); //в качестве параметра передается значение

void Func2 (BigStruct *bs); //в качестве параметра передается указатель

void Func3 (BigStruct &bs); //в качестве параметра передается ссылка

Вызов функции Func1 связан с копированием в стек всех 1000 элементов массива из структуры BigStruct. Ситуация меняется в двух других случаях, когда передается только адрес stObject. В последнем случае мы работаем с этим адресом как с переменной, и не требуется дополнительных действий по взятию адреса.

1.6. Новая роль имён перечислений, структур и объединений

В С++ имя перечисления, структуры или объединения является именем ти­па. Это упрощает нотацию, поскольку не нужно использовать ключевые слова enum, struct и union перед именем соответствующего типа. Таким об­разом, в С++ выражения вида

struct Fruits {

// компоненты структуры

};

Fruits stApple; // Определение переменной типа Fruits

являются допустимыми,

1.7. Распределение памяти

В С++ встроены специальные операторы для управления памятью – new и delete. Они чрезвычайно удобны для динамического создания и удаления переменных, массивов и объектов классов и заменяют функции malloc, calloc, free, используемые в С.

Определены три способа использования оператора new:

new type_name; // Выделяется память под объект типа type_name

new type_name (initValue); // Выделяется память под объект типа type_name

// с одновременной инициализацией new type_name[size]; // Выделяется память под size объектов

// типа type_name

Для первого способа существует эквивалентная запись: new (type_name);

Этот оператор запрашивает у системы память, необходимую для размеще­ния объекта и возвращает на нее указатель.

Для удаления объекта, созданного с помощью оператора new, необходимо выполнить оператор delete, который может использоваться двумя способами:

delete vObject; // Освободить память, занятую объектом

delete [ ] vObject; // Освободить память, занятую массивом объектов

Примечание

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