
- •Базовые принципы объектно-ориентированного программирования.
- •Базовые конструкции объектно-ориентированных программ.
- •Конструктор и деструктор. Конструктор по умолчанию.
- •Конструктор копирования.
- •Конструктор explicit.
- •Указатель this.
- •Абстрактные типы данных.
- •Операторы для динамического выделения и освобождения памяти (new и delete).
- •Перегрузка и переопределение функций.
- •Перегрузка бинарных операторов.
- •Перегрузка унарных операторов.
- •19.20.Перегрузка оператора new.Перегрузка оператора delete.
- •22.Inline-функции.
- •23.Вложенные классы
- •24.Static-компоненты данные класса
- •25.26.Static и const-компоненты функции класса
- •27.Использование new delete для реализации массивов
- •28.Организация внешнего доступа к локальным компонентам класса(friend)
- •29.Ссылки.Параметры ссылки
- •30.Ссылки.Независимые ссылки
- •31.Инициализация компонент-данных объекта. Конструктор с параметрами.
- •33.Наследование. Открытое, защищенное и закрытое.
- •34.Виртуальные функции.
- •35.Множественное наследование.
- •36.Множественное наследование и виртуальные базовые классы
- •38.Proxi-классы.
- •39.40.Пространство имен. Пространство имен как объявление. Пространство имен как директива.
- •41.Виртуальные функции
- •42.Параметризированные классы (шаблоны).
- •43.Шаблоны функций.
- •44.Передача в шаблон класса дополнительных параметров.
- •44.Совместное использование шаблонов и наследования.
- •45.Шаблоны класса и friend.
- •46.Реализация smart-указателя.
- •48.Транзакции.
Операторы для динамического выделения и освобождения памяти (new и delete).
Различают два типа памяти: статическую и динамическую. В статической
памяти размещаются локальные и глобальные данные при их описании в функ-
циях. Для временного хранения данных в памяти ЭВМ используется динамиче-
ская память, или heap. Размер этой памяти ограничен, и запрос на динамическое
выделение памяти может быть выполнен далеко не всегда.
Для работы с динамической памятью в языке С использовались функции
calloc, malloc, realloc, free и др. В С++ для операций выделения и освобождения
памяти можно также использовать встроенные операторы new и delete.
Оператор new имеет один операнд. Оператор имеет две формы записи:
[::] new [(список_аргументов)] имя_типа [(инициализирующее_значение)]
[::] new [(список_аргументов)] (имя_типа) [(инициализирующее_значение)]
В простейшем виде оператор new можно записать:
new имя_типа или new (имя_типа)
Оператор new возвращает указатель на объект типа «имя_типа», для ко-
торого выполняется выделение памяти. Например:
char *str; // str – указатель на объект типа char
str=new char; // выделение памяти под объект типа char
или
str=new (char);
class A
{ int i; // компонента-данное класса А
public:
A(){} // конструктор класса А
~A(){} // деструктор класса А
};
int main()
{ A *a,*b; // описание указателей на объект класса А
float *c,*d; // описание указателей на элементы типа float
a=new A; // выделение памяти для одного объекта класса А
b=new A[3]; // выделение памяти для массива объектов класса А
c=new float; // выделение памяти для одного элемента типа float
d=new float[4]; // выделение памяти для массива элементов типа float
delete a; // освобождение памяти, занимаемой одним объектом
delete [] b; // освобождение памяти, занимаемой массивом объектов
delete c; // освобождение памяти одного элемента типа float
delete [] d; // освобождение памяти массива элементов типа float
}
При удалении объекта оператором delete вначале вызывается деструктор
этого объекта, а потом освобождается память. При удалении массива объектов с
помощью операции delete[] деструктор вызывается для каждого элемента мас-
сива. В качестве аргументов можно использовать как стандартные типы дан-
ных, так и определенные пользователем. В этом случае именем типа будет имя
структуры или класса. Если память не может быть выделена, оператор new воз-
вращает значение NULL.
Перегрузка и переопределение функций.
Перегруженные функции. Они имеют одинаковые имена, но разное количество и\или типы параметров.
Переопределённые функции. У них совпадает сигнатура (имя + параметры).
Они имею разную реализацию.
class A
{
int i;
public:
A(int ii = 0) {i = ii;}
void show() {cout<<i<<endl;}
};
class B:A
{
int j;
public:
B(int ii = 0, int jj = 1):A(ii) {j=jj;}
void show()
{cout<<j<<endl;
A::show();
}
};
void main()
{ A obj(5);
obj.show();
B obj2(7,4);
obj.show();
}
//На экране будет
5 4 7