
- •Структуры
- •Массив структур
- •Указатели на структуру
- •Битовые поля
- •Объединения
- •Перечисления
- •Переименование типов
- •Открытие файла
- •Функции работы с файлами
- •Форматный ввод/вывод
- •Ввод/вывод строк. Функции позиционирования
- •Чтение из двоичного файла и запись в него
- •Свойства ООП
- •1.1 Свойства ООП
- •Понятие класса в С++
- •1.2 Понятие класса С++
- •Создание класса
- •1.3 Создание класса
- •Члены класса
- •1.4 Члены класса
- •Инкапсуляция
- •1.5. Инкапсуляция
- •1.6 Функции-члены класса
- •Реализация понятия «дата» при помощи структуры
- •1.7 Реализация понятия «дата» при помощи структуры
- •Реализация понятия «дата» при помощи класса
- •1.8 Реализация понятия «дата» при помощи класса
- •Определение и вызов функций–членов класса
- •Выводы. Примеры
- •1.9 Выводы
- •1.10 Пример создания класса
- •Конструкторы
- •2.1 Конструкторы
- •2.2 Пример класса без конструктора
- •2.3 Пример класса с конструктором
- •2.4. Конструктор с параметрами по умолчанию
- •2.5. Деструкторы
- •2.6. Пример класса с конструктором и деструктором
- •2.7. Подставляемые или inline функции.
- •2.8. Подставляемые функции-члены.
- •2.9. Указатель this
- •2.10. Использование указателя this
- •Дружественные функции
- •3.1 Дружественные функции
- •3.2 Пример дружественной функции
- •3.3 Дружественные классы
- •3.4. Уточнение имени элемента.
- •3.5. Определение переменных непосредственно перед использованием
- •3.6. Статические элементы класса.
- •2.7. Пример
- •Перегруженные функции
- •4. Перегрузка функций и операций
- •4.1 Полиморфизм
- •4.2 Перегруженные функции
- •4.3 Перегрузка конструктора
- •4.4 Выбор экземпляра функции
- •4.5 Перегрузка стандартных операций
- •4.6 Перегрузка операций сложения и присваивания
- •4.7 Перегрузка операций ++ и --
- •4.8 Дружественные функции-операции
- •4.9 Перегрузка операции индексации []
- •4.10 Аргументы по умолчанию
- •5. Работа с объектами
- •5.1 Ссылки в С++
- •5.2 Передача объектов, как аргументов функции
- •5.3 Массивы объектов
- •5.4 Указатель на объект
- •5.5 Динамическое выделение памяти. Операторы new, delete.
- •5.6 Локальные классы
- •5.7 Вложенные классы
- •5.8 Имена заголовочных файлов в С++
- •5.9 Строковые переменные в С++.
- •6. Наследование
- •6.1 Понятие наследования
- •6.2 Базовые и производные классы
- •6.3 Одиночное и множественное наследование
- •6.4 Управление доступом производных классов
- •6.5 Пример
- •6.6 Конструкторы с параметрами при наследовании
- •6.7 Конструкторы при множественном наследовании
- •7. Виртуальные функции. абстрактные классы
- •7.1 Указатели на производные типы
- •7.2 Виртуальные функции
- •7.3 Пример
- •7.4 Чистые виртуальные функции и абстрактные типы
- •7.5 Виртуальные базовые классы
- •7.6 Шаблоны
- •7.7 Шаблоны функций
- •7.8 Пример
- •7.9 Использование шаблонов с двумя типами параметров
- •7.10 Шаблоны классов
Конструкторы
2.1 Конструкторы
Некоторые функции-члены класса являются специальными в том смысле, что они влияют на создание, копирование и уничтожение объектов класса или задают способ приведения значений к значениям других типов. Часто такие специальные функции вызываются неявно. Рассмотрим функцию-конструктор.
Для большинства объектов естественно требовать, чтобы они были инициализированы до начала их использования.
В С++ существуют два способа определить переменную. Можно сначала объявить переменную, а затем (несколько ниже в программе) присвоить ей значение, например:
int Kurs; // объявить целочисленную переменную
Kurs = 2; // присвоить переменной значение
Или, определив переменную, сразу же инициализировать ее, например:
int Kurs = 2; /*определить переменную Kurs и инициализировать значением 2 */
Инициализация объединяет определение переменной с присвоением ей исходного значения, что, однако, ничуть не запрещает изменить это значение впоследствии. Инициализация гарантирует, что переменная никогда не останется без значения. В предыдущем примере переменные объекта класса sum устанавливались «вручную» с помощью функции get_xy():
z.get_xy(x2,y2);
В профессионально написанных программах такой подход все же применяется редко. Для инициализации элементов используется специальная функция, называемая конструктором.
Конструктор – специальная функция, являющаяся членом класса и имеющая тоже имя, что и класс. Для конструктора не указывается тип возвращаемого значения (даже void не допустим).
2.2 Пример класса без конструктора
Пример: создать класс, реализующий сумму двух целых чисел
/*Создать класс, реализующий сумму
двух целых чисел */
#include <iostream>
using namespace std;
class sum
{
int x,y,z;
public: void get_xy (int x1, int y1); void summa (void);
};
void sum :: get_xy (int x1, int y1)
{x=x1;
y=y1;}
void sum :: summa (void) {z= x+y; cout<<"Сумма:"<<z;}
int main(int argc, char** argv) { int x2, y2;
sum z;
cout<<"Введите первое слагаемое: \n"; cin>>x2;
cout<<"Введите второе слагаемое: \n"; cin>>y2;
z.get_xy(x2,y2); z.summa(); return 0;
}
2.3 Пример класса с конструктором
#include <iostream>
using namespace std;
class sum
{
int x,y,z;
public:
sum (int x1, int y1);
void summa (void);
};
sum :: sum (int x1, int y1)
{ x=x1;
y=y1;}
void sum :: summa (void)
{z= x+y;
cout<<"Сумма:"<<z;}
int main(int argc, char** argv) {
int x2, y2;
cout<<"Введите первое слагаемое: \n";
cin>>x2;
cout<<"Введите второе слагаемое: \n";
cin>>y2;
sum z(x2,y2);
z.summa();
return 0;
}
Если функция конструктор требует параметр, то в момент создания объекта они должны быть обязательно переданы. Функция конструктор вызывается в момент создания объекта. Если объект локальный, то при входе в блок, если глобальный – один раз при создании объекта в начале программы. Функцию конструктор нельзя вызвать явно.
Класс может иметь несколько конструкторов, различающихся набором аргументов.
Для передачи значений элементам данных объекта с помощью конструктора существует два формата записи:
1.имя класса_ имя объекта = имя конструктора (список аргументов):
sumz = sum(5,7);
2.имя конструктора_ имя объекта (список аргумента):
sumz(5,7);
2.4. Конструктор с параметрами по умолчанию
Конструктор может иметь параметры со значением по умолчанию.
#include <iostream> using namespace std; class sum
{
int x,y,z; public:
sum (int x1=0, int y1=0); void summa (void);
};
sum :: sum (int x1=0, int y1=0)
{x=x1;
y=y1;}
void sum :: summa (void) {z= x+y; cout<<"Сумма:"<<z;}
int main(int argc, char** argv) { int x2, y2;
cout<<"Введите первое слагаемое: \n"; cin>>x2;
cout<<"Введите второе слагаемое: \n"; cin>>y2;