- •Базовое ядро языка Элементы программы.
- •Комментарии
- •Инструкция – выражение
- •Инструкция
- •Определение функции
- •Заголовок функции
- •Прототипы функций
- •Аргументы по умолчанию.
- •Перегрузка функций
- •Встраиваемые функции
- •Стек до блока Вошли в блок Вышли из блока
- •Индексирование
- •Int a [100]; одномерный массив
- •Int b [3][5]; двухмерный массив
- •Int c [7][9][2]; трехмерный массив
- •Передача массивов функциям
- •Объявления ссылок и вызовов по ссылке
- •Функции-члены класса
- •Доступ: закрытый и открытый
- •Область видимости класса
- •Оператор разрешения области видимости ::
- •Вложенные классы
- •Статические члены данных
- •Указатель this
- •Функции-члены типа static и const.
- •Изменчивость (mutable)
- •Создание и уничтожение объектов
- •Классы с конструкторами
- •Конструкторы как преобразования
- •Создание динамического стека
- •Классы с деструкторами
- •Пример: динамически размещаемые строки
- •Ad hoc полиморфизм
- •Алгоритм выбора перегруженной функции
- •Перегрузка операторов
- •Перегрузка бинарных операторов
- •Перегрузка операторов присваивания и индексирования
- •Перегруженные операторы ввода-вывода « и »
- •Перегрузка оператора ( ) для индексирования
- •Операторы указателей
- •Указатель на член класса
- •Перегрузка new и delete
- •Наследование.
- •Методология объективно-ориентированного проектирования
- •Виртуальные функции
- •Абстрактные базовые классы
Стек до блока Вошли в блок Вышли из блока
Класс памяти register
Как правило вычисления с регистрами выполняются в ПК быстрее чем с оперативной памятью. Поэтому, когда важна скорость вычислений, программист может несколько переменных разместить в регистрах. Например,
{ for(register i=0; i<LIMIT; i++)
{…
}
Вообще этот класс компилятор воспринимает как рекомендацию. Поэтому, если мы написали register, это вовсе не значит, что переменная действительно будет в регистре.
Для явного указания того, чтобы переменная не была размещена в регистре используется слово volatile (для компилятора Borland)
Класс памяти extern.
Когда переменная объявлена вне функции, память для нее выделяется на постоянной основе (не в стеке), а класс памяти extern. Переменная, объявленная со словом extern, является глобальной. Компилятор ищет эту переменную во всех файлах, компилируемых в одну программу.
Внешние (глобальные) переменные существуют на протяжении всей жизни программы (выполнении программы) они могут использоваться для передачи значений между функциями (хотя это не рекомендуется).
Класс памяти static
Статические переменные имеют два важных применения.
Локальная статическая переменная сохраняет предыдущее значение при повторном входе в блок.
Пример.Int f ()
{ static int called=0; ++called;
. . . . return called; }
Область действия статических переменных ограничена функцией, в которой она объявлена.
Статические функции видны только внутри файла, в котором они определены. В отличии от обычных функций, к которым возможен доступ из других файлов, статическая функция доступна только в своем файле.
static int goo (int a) { . . . . }
int foo (int a) { . . . .
b=goo (a); //goo доступна только в этом файле
. . . . }
Некоторые особенности компоновки.
Имя, объявленное в области видимости файла, как static, является локальным и скрыто от других файлов. Так же ведут себя функции, объявленные inline и переменные с модификатором const. Переменные const, находящиеся в области видимости файла, но не являющиеся статической, может быть задан внешний тип компоновки с помощью объявления ее extern.
Программы на Си++ могут компоноваться с программами на Си на Паскале, в зависимости от реализации.
Пространство имен.
Си++ унаследовал от Си единое пространство имен. Возникающие из-за этого конфликты привели к появлению в Си++ области видимости пространства имен.
Namespace LMPinc
{ class purrles{…};
class toys{…};
. . . . }
Идентификатор пространства имен может быть использован, как часть идентификатора, разрешающего область видимости. Идентификатор_пространства_имен :: идентификатор
Существуют также объявление using, которое позволяет получить доступ ко всем именам из пространства имен.
using namespace LMPinc;
toys top; //используется LMPinc :: toys
Пространства имен могут быть вложенными.
namespase LMPout
{ int n; namespace LMPin
{ int sq()
{ return n*n;
} //LMPout :: n
void pr_mu_logo():
}
void LMPin :: pr_mu_logo()
{
cout<<”LMPinc”<<eldl;
} }
Вместо глобальных статических переменных может использоваться безымянное пространство имен. Например,
Namespace { int count=0; } //здесь count уникальный // count доступна в void chg_cnt(int i) остальной части файла
{ count=i;
} Перечислимые типы.
Ключевое слово enum используется для объявления особого целого типа с набором именованных целых констант, называемых константами перечислимого типа или перечислимыми константами.
enum suit {clubs, diamonds, hearts, spides};
0 1 2 3 по умолчанию
Перечислимые константы могут быть инициализированы произвольными целыми константами, а также целыми выражениями
enum ages {laura=7, ira=8, harold=59, philip=harold+7};
66
Теговые имена и имена перечислимых констант должны быть уникальны в пределах области видимости.
Перечислимые константы могут быть преобразованы к обычному целому типу, но не наоборот.
enum signal {off,on}a=on; //a присвоено значение on=1
enum answer {no, yes, maybe=-1}b;
enum negative {no, false}c; //недопустимо no и false переобъяв
int i, j=on; //допустимо a=off; //допустимо
i=a; //допустимо b=a; // недопустимо, разные типы
b=static_cast<answer>(a); //допустимо
b=(a? No : yes);
Типы указателей.
Указатели в Си++ используются для связи переменных с «машинными» адресами.
Если v – переменная, то &v – это адрес, или место в памяти, где хранится ее значение. Пример объявления указателя на целое Int*p;
Допустимая область значений:специальный адрес 0 (обычно длуказанияошибки)
положительные целые числа, которые интерпретируются как машинные адреса в зависимости от конкретной системы.
Примеры присваивания значений.p=&i; // адрес объекта i p=0; // нулевое значение
p=static_cast<int*> (1507); // абсолютный адрес
/* об'явление, инициализация и разыменовывание указателя */
#include <stdio.h>
char c; /* Символьная переменная */
main()
{ char *pc; /* Указатель на символьную переменную */
pc = &c;
for (c = 'A'; c <= 'Z'; c++)
printf("%c", *pc);
return 0; }
Определение адреса и разыменования.
Если p – указатель, то *р – это значение, находящееся по адресу, который хранится в указателе р. Рассмотрим примеры:
Int i=5;j; Int*p=8i; //указатель инициализирован адресом переменной i
Cout<<*p<<”=i, хранится по адресу”endl;
J=p: // недопустимо, указатель не преобразуется в целое
J=*p+1; //допустимо p=8j; // теперь р указывает на j
При обращении к функции указатели могут передаваться в качестве аргументов.
//вызов по ссылке на основе указателей
void order (int*, int*);
int main()
{ int i=7, j=3;
cout<<i<<’\t’<<j<<endl; //напечатается 7и3
order (&, &j );
cout<<i<<’\t’<<j<<endl; //напечатаются 3 7 }
void order (int*p, int*q)
{ int temp;
if (*p>*q) {
temp=*p;
*p=*q;
*q=temp; }
}
Применение void.
Ключевое слово void используется как возвращаемый тип функции, не возвращающей значения. Для указателей void используется для объявления обобщенного указателя (void*p;). Такому указателю можно присвоить адрес переменной любого типа, но он не может быть разыменован.
void*gp; // обобщенный указатель int*ip; // указатель на int
char*cp // указатель char gp=ip; // допустимо
cp=ip // не допустимо *ip=15 // допустимо
*ip=*gp; // недпустимо разыменвание gp\\\\ ip=static_cast<int*>(gp); /допуст
Массивы и указатели Массив (array) — это тип данных, который используется для представления последовательности однородных значений. Доступ к элементам массива производится с помощью индексов. В C++ возможны массивы любых типов, включая массивы массивов. Объявление типичного массива используется для выделения памяти, начиная с базового адреса. На самом деле имя массива является постоянным указателем, инициализованным этим базовым адресом.
ая заполняет массив, выводит значения и суммирует элементы:
