- •Базовые принципы объектно-ориентированного программирования.
- •Базовые конструкции объектно-ориентированных программ.
- •Конструктор и деструктор. Конструктор по умолчанию.
- •Конструктор копирования.
- •Конструктор 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.Транзакции.
Указатель this.
Каждому объявляемому объекту соответствует свой скрытый this-указатель; this м.б. использован только для нестатических функций; this указывает на начало своего объекта в памяти; this не надо дополнительно объявлять; this передаётся как скрытый аргумент во все нестатические компоненты-функции своего объекта: this – локальная переменная и недоступна за пределами объекта.
Пример: Упорядочивание чисел в массиве.
class Mass
{int a[3];
public:
Mass sort();
Mass *input();
void out();
};
Mass Mass::sort()
{ for(int i = 0; i < 2; i++)
for(int j = i; j < 3; j++)
if (a[i]>a[j])
{ a[i] = a[i] + a[j]; a[j] = a[i] - a[j]; a[i] = a[i] - a[j]; }
return *this; //возврат содержимого объекта
}
Mass *Mass::input()
{
for (int i = 0; i < 3; i++) cin>>a[i];
return this; //возврат адреса начала объекта
}
void Mass::out()
{
cout<<endl;
for(int i = 0; i<3; i++)
cout<< a[i] << ' ';
}
void main()
{
Mass o1;
o1.input()->sort().out();
}
Вызывается функция input для ввода инфо в массив объекта o1; эта функция возвращает адрес памяти, где расположен объект o1; вызывается функция сортировки, возвращающая содержимое объекта о1; функция вывода инфо.
Абстрактные типы данных.
Абстра́ктный тип да́нных (АТД) — это тип данных, который предоставляет для работы с элементами этого типа определённый набор функций, а также возможность создавать элементы этого типа при помощи специальных функций. Вся внутренняя структура такого типа спрятана от разработчика программного обеспечения — в этом и заключается суть абстракции. Абстрактный тип данных определяет набор независимых от конкретной реализации типа функций для оперирования его значениями. Конкретные реализации АТД называются структурами данных.
В программировании абстрактные типы данных обычно представляются в виде интерфейсов, которые скрывают соответствующие реализации типов. Программисты работают с абстрактными типами данных исключительно через их интерфейсы, поскольку реализация может в будущем измениться. Такой подход соответствует принципу инкапсуляции в объектно-ориентированном программировании. Сильной стороной этой методики является именно сокрытие реализации. Раз вовне опубликован только интерфейс, то пока структура данных поддерживает этот интерфейс, все программы, работающие с заданной структурой абстрактным типом данных, будут продолжать работать. Разработчики структур данных стараются, не меняя внешего интерфейса и семантики функций, постепенно дорабатывать реализации, улучшая алгоритмы по скорости, надежности и используемой памяти.
Различие между абстрактными типами данных и структурами данных, которые реализуют абстрактные типы, можно пояснить на следующем примере. Абстрактный тип данных список может быть реализован при помощи массива или линейного списка, с использованием различных техник динамического выделения памяти. Однако каждая реализация определяет один и тот же набор функций, который должен работать одинаково (по результату, а не по скорости) для всех реализации.
Абстрактные типы данных позволяют достичь модульности программных продуктов и иметь несколько альтернативных взаимозаменяемых реализаций отдельного модуля.
class A
{ private: int a;
public:
void set_a(int num);
int get_a();
};
void A::set_a(int num)
{ a = num;}
int A::get_a()
{ return a;}
void main()
{
A ob1, ob2;
ob1.set_a(10);
ob2.set_a(99);
//ob1.a = 10;//ERROR
cout << ob1.get_a() << endl;
cout << ob2.get_a() << endl;
}
Организация простейшего ввода/вывода в С++.
В С++ ввод и вывод данных производится потоками байт. Поток (последовательность байт) − это логическое устройство, которое выдает и принимает информацию от пользователя и связано с физическими устройствами ввода-вывода. При операциях ввода байты направляются от устройства в основную память. В операциях вывода – наоборот.
cin [>>имя_переменной]; Объект cin имеет некоторые недостатки. Необходимо, чтобы данные вводились в соответствии с форматом переменных, что не всегда может быть гарантировано.
сout << data [ << data];
data − это переменные, константы, выражения или комбинации всех трех
типов.
Простейший пример применения cout − это вывод, например, символьной
строки:
cout << ”объектно-ориентированное программирование ”;
Использование манипуляторов для ввода/вывода в С++.
cout << setw(10) << setfill('*') << a << endl;
setw(количество_позиций_для_вывода_числа)
setfil(символ_для_заполнения_пустых_позиций)
setprecision (точность_при_выводе_дробного_числа
int main()
{ int a=0x11, b=4, // целые числа: шестнадцатеричное и десятичное
c=051, d=8, // восьмеричное и десятичное
i,j;
i=a+b;
j=c+d;
cout << i <<' ' <<hex << i <<' '<<oct << i <<' ' <<dec << i <<endl;
cout <<hex << j <<' ' << j <<' '<<dec << j <<' ' << oct << j <<endl;
return 0;
}
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{ int a=0x11;
double d=12.362;
cout << setw(4) << a << endl;
cout << setw(10) << setfill('*') << a << endl;
cout << setw(10 ) << setfill(' ') << setprecision(3) << d << endl;
return 0;
}
Результат работы программы:
17
********17
12.4
