Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
О.О.П / ооп / 4_кол / Лекції / 17. Об'єктно-орієнтоване програмування, л.5.4.ppt
Скачиваний:
23
Добавлен:
30.05.2020
Размер:
542.21 Кб
Скачать

Конструктор

копіювання

(копіюючийУ мові 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&);

//

};