- •1. Дополнения к с
- •1.1. Комментарии
- •1.2. Ключевые слова
- •1.3. Константы
- •1.4. Блочные объявления
- •1.5. Ссылки
- •1.6. Новая роль имён перечислений, структур и объединений
- •1.7. Распределение памяти
- •1.8. Встраиваемые функции
- •1.9. Перегрузка функций
- •1.10. Задание для параметров функции значений по умолчанию
- •1.11. Дополнительные операции для доступа к данным
- •1.12. Предопределённые потоки ввода-вывода
- •2.1. Инкапсуляция
- •2.2. Разграничение доступа (скрытие данных и методов)
- •2.3. Друзья классов
- •2.4. Конструкторы и деструкторы
- •2.5. Конструктор по умолчанию
- •2.6. Конструктор копирования
- •2.7. Несколько слов о деструкторах
- •2.8. Перегрузка операций
- •3.1. Наследование
- •3.2. Виртуальные функции –полиморфизм
- •3.3. Шаблоны
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 к неинициализированному указателю является ошибкой, за которой должен следить программист.