- •Об'єктно-орієнтоване
- •Класи і об'єкти
- •Дані об'єкту (змінні об'єкту,члени-дані)
- •Методи класу
- •Властивості
- •Приклад: Трикутник
- •class Point
- •Найважливіші принципи ООП
- •Абстракція даних
- •Інкапсуляція
- •class IntStack
- •Спадкоємство
- •class Plane
- •Поліморфізм
- •class Shape
- •Приклад
- •Розміщення класів в різних файлах
- •date.h
- •Обмеження доступу до даних і методів
- •Публічні (public) поля класу
- •Закриті (приватні)
- •Захищені поля класу
- •class Date
- •Посилання на себе
- •class ListItem
- •Константні методи
- •Коли виникає необхідність в константних методах
- •class IntArray
- •Мінливі (mutable) дані класу
- •class VeryComplexShape
- •Ініціалізація екземпляра
- •class Date
- •Конструктор
- •Ініціалізація даних екземпляра класу
- •Списки ініціалізації
- •class Foo
- •Деініціалізація екземпляра класу
- •class MyFile
- •Конструктор
- •Автоматично
- •Створення власного
- •Заборона
- •class CFile
Конструктор
копіювання
(копіюючийУ мові C++ існує спеціальний тип конструкторів, що використовується
конструктор)для створення копії об'єкту
Явне створення копії об'єкту програмістом
Неявне створення копії об'єкту
Повернення об'єкту з функції
Передача об'єкту у функцію за значенням
Під час роботи механізму виключень
Синтаксис
Type(Type const& t);
Автоматично
згенерований конструктор копіювання
Якщо програміст не визначить конструктор копіювання явно, компілятор згенерує його під час компіляції
автоматично згенерований конструктор копіювання, здійснює
копіювання всіх полів класу,
викликаючи для них їх конструктори копіювання
#include "stdio.h"
class Foo
{
public:
Foo():m_moo(0)
{
}
Foo(Foo const& foo) :m_moo(foo.m_moo)
{
printf("Creating copy of foo\n");
}
private:
int m_moo;
};
Bar g()
{
printf("g()\n");
Bar b; return b;
}
int main()
{
Bar b0;
printf("Call f()\n"); f(b0);
printf("Call g()\n"); Bar b1 = (g()); b1.Do();
return 0;
}
class Bar
{
public:
void Do()
{
printf("Do\n");
}
private:
Foo m_foo;
};
void f(Bar b)
{
printf("f()\n");
b.Do();
}
OUTPUT:
Call f()
Creating copy of foo f()
Do
Call g() g()
Creating copy of foo
Do
Створення власного
конструктора
копіюванняЧасто виникають ситуації, коли конструктор копіювання, що автоматично згенерував, не личить
Приклад - клас, що реалізовує масив
Стандартний конструктор копіювання просто скопіює значення покажчика на елементи масиву, тоді як необхідно виділити в динамічній пам'яті новий масив і скопіювати в нього дані з оригінального масиву
В цьому випадку програміст повинен розробити власний конструктор копіювання
#include "stdio.h"
#include "memory.h"
class IntArray
{
public:
IntArray():m_pData(NULL), m_size(0){}
IntArray(IntArray const& arr) :m_pData(new int [arr.m_size])
,m_size(arr.m_size)
{
if (m_size != 0)
{
memcpy(m_pData, arr.m_pData, sizeof(int) *
m_size);
}
}
private:
int * m_pData; int m_size;
};
Заборона
копіювання об'єктів
Можливі ситуації, коли операція копіювання об'єкту не має сенсу і має бути заборонена
Клас, що інкапсулює мережеве з'єднанняКлас, що інкапсулює роботу з файлом
Об'єкт повинен існувати в єдиному екземплярі усередині застосування, наприклад, «клавіатура»
Для заборони копіювання об'єкту, конструктор копіювання оголошується в закритої (private) області класу
Реалізацію даного конструктора можна не
писати
class CFile
{
public:
//…
private:
CFile(Cfile const&);
//…
};