
- •Базовое ядро языка Элементы программы.
- •Комментарии
- •Инструкция – выражение
- •Инструкция
- •Определение функции
- •Заголовок функции
- •Прототипы функций
- •Аргументы по умолчанию.
- •Перегрузка функций
- •Встраиваемые функции
- •Стек до блока Вошли в блок Вышли из блока
- •Индексирование
- •Int a [100]; одномерный массив
- •Int b [3][5]; двухмерный массив
- •Int c [7][9][2]; трехмерный массив
- •Передача массивов функциям
- •Объявления ссылок и вызовов по ссылке
- •Функции-члены класса
- •Доступ: закрытый и открытый
- •Область видимости класса
- •Оператор разрешения области видимости ::
- •Вложенные классы
- •Статические члены данных
- •Указатель this
- •Функции-члены типа static и const.
- •Изменчивость (mutable)
- •Создание и уничтожение объектов
- •Классы с конструкторами
- •Конструкторы как преобразования
- •Создание динамического стека
- •Классы с деструкторами
- •Пример: динамически размещаемые строки
- •Ad hoc полиморфизм
- •Алгоритм выбора перегруженной функции
- •Перегрузка операторов
- •Перегрузка бинарных операторов
- •Перегрузка операторов присваивания и индексирования
- •Перегруженные операторы ввода-вывода « и »
- •Перегрузка оператора ( ) для индексирования
- •Операторы указателей
- •Указатель на член класса
- •Перегрузка new и delete
- •Наследование.
- •Методология объективно-ориентированного проектирования
- •Виртуальные функции
- •Абстрактные базовые классы
Передача массивов функциям
В определении функции формальный параметр, который объявлен как массив, по сути является указателем. Когда функции передается массив, на самом деле передается по значению его базовый адрес. Сами элементы массива не копируются. Для удобства записи компилятор допускает запись с квадратными скобками [ ] (как у массивов) при объявлении указателей в качестве параметров.
nt sum (const int a [ ], int n) // n – это размер массива a [ ]
{ int i, s = 0; for (i = 0; i <n; ++i) s +=a [i];
return s; }
Как часть заголовка определения функции объявление int a [ ];равнозначно int *a;
Вызов |
Результат |
sum ( v, 100 ) |
v[0] + v[1] + …+ v[99] |
sum ( v, 88 ) |
v[0] + v[1] + …+ v[87] |
sum ( v + 7, k ) |
v[7] + v[8] + …+ v[k+6] |
Объявления ссылок и вызовов по ссылке
Объявление ссылки вводит идентификатор, который будет альтернативным именем или псевдонимом (alias), для объекта, указанного при инициализации ссылки, и допускает более простую форму параметров при вызове по ссылке. Например:
int n; int& nn = n; // nn - альтернативное имя для n
double a [10]; double& last = a[9]; // last - псевдоним для a[9]
Объявление ссылки, которое является ее определением, должно содержать инициализатор. Обычно ссылки инициализируются простыми переменными. В примерах выше имена n и nn – псевдонимы друг для друга, то есть они ссылаются на один и тот же объект. Изменение nn равнозначно изменению n и наоборот. Имя last является альтернативным именем для конкретного элемента массива a[9]. Будучи однажды инициализованы, эти имена не могут быть изменены.
Предположим, что память по адресу 1004 используется для хранения целой переменной a, а память по адресу 1008 – для переменной - указателя p.
int a = 5; // объявление a int* p = &a; // p указывает на a
int& ref_a = a; // псевдоним для a *p = 7; // выражению lvalue
a = *p + 1; // к rvalue 7 добавляется 1 и a присваивается 7
// присваивается 8
1004p
адрес 1008
5 78
А адрес 1004 ref_a является псевдонимом для a
Обратите внимание, что любое изменение значения a равносильно изменению ref_a. Рассмотрим функцию order ( ).
void order (int& p, int& q)
{ int temp; if (p > q) { temp = p; p = q; q = temp; } }
Прототип и вызов из main ( ) функции order ( ) может выглядеть так:
void order (int& , int& ); int main ( ) { int i, j; …..
order (i, j); ….. }
При вызове order (i, j), если их значения i > j изменяются. Если бы вызвать без ссылок, их значения не изменились.
В C++ оператор new принимает следующие формы:
new имя_типа new имя_типа инициализатор new имя_типа [выражение]
int *p, *q; p = new int (5); // выделение памяти и инициализация
q = new int [10]; // получаем массив от q [0] до q [9]причем q = &q[0]
В этом фрагменте указателю на целое p присваивается адрес ячейки памяти, полученный при размещении целого объекта. Место в памяти, на которое указывает p, инициализуется значением 5.
Оператор delete уничтожает объект, созданный с помощью new, отдавая тем самым распределенную память для повторного использования. Оператор delete может принимать следующие формы:delete выражение delete[ ] выражение
Первая форма используется, если new размещало не массив. Во второй форме присутствуют пустые квадратные скобки, что изначально размещался массив объектов. delete не возвращает значения, поэтому возвращаемый им тип – void.