Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
распечатать.docx
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
160.66 Кб
Скачать

11. Конструктор копирования. Примеры

Конструктор копирования

Конструктор копирования – вид перегруженного конструктора. Он позволяет предотвратить проблемы, которые могут возникнуть при присваивании одного объекта другому.

Например, конструктор копирования необходим для решения такой проблемы: по умолчанию. Если один

объект инициализируется другим, создается побитовая копия присваемого объекта.

MyClass B=A;

Если при этом создается побитовая копия объекта А, то объект В будет точной копией этого объекта. Следовательно, объект В также будет ссылаться на область памяти, выделенную объектом А, не выделяя собственный участок. Если класс содержит деструктор, освобождающий память, то при уничтожении объектов А и В одна и та же область памяти будет освобождаться дважды.

Конструктор копирования имеет следующий синтаксис

имя_класса :: имя_класса (const имя_класса &ob) //ob – ссылка на объект

{

// тело конструктора

}

struct Array

{

int *element; //Указатель на int

int size; //Размер массива

Array(int N); //Конструктор принимает параметр, по которому определяет количество элементов для массива

Array(Array &obj); //Конструктор копирования

~Array(); //Деструктор для освобождения памяти

};

Array::Array(int N) //Описываю конструктор с параметром типа int вне класса

{

element=new int[N]; //При каждом новом вызове выделяю память для N элементов типа int

size=N; //Запоминаю размер согласно указанному параметру

}

Array::Array(Array &obj) //Описываю конструктор копирования вне класса

{

element=new int[obj.size]; //Выделяю память для элемента объекта

for (int i=0;i<obj.size;i++) element[i]=obj.element[i]; //Поэлементно копирую каждый элемент из принимаемого объекта в текущий

}

Array::~Array() //Описываю деструктор вне класса

{

delete []element; //Освобождаю память

}

int main()

{

system("CLS");

Array v(3); //Объявил объект v и указал, что он содержит три элемента

v.element[0]=20; //Записал данные в объект

v.element[1]=30;

v.element[2]=40;

Array x=v; //Объявляю второй объект и копирую в него данные из первого

cout<<x.element[0]<<" "<<x.element[1]<<" "<<x.element[2]<<endl; //Вывожу данные второго объекта на экран

v.element[0]=100; //Меняю одно поле первого объекта

cout<<x.element[0]<<" "<<x.element[1]<<" "<<x.element[2]<<endl; //Вывожу данные второго объекта на экран

cin.get();return 0;}

12. Наследование и спецификаторы доступа. Примеры.

Процесс наследования позволяет создать иерархию классов таким образом, что один класс может приобретать свойства другого класса и добавлять к ним свои собственные свойства.

Когда один класс наследуется другим, тот класс, который наследуется, называется базовым классом. Наследующий класс называется производным классом. Процесс наследования начинается с задания базового класса, который определяет все те качества, которые будут общими для всех производных от него классов. Базовый класс часто называют предком, производный - потомком.

Синтаксис наследования базового класса производным:

class имя_производного_класса : спецификатор_доступа имя_базового_класса

{

// объявление производного класса

};

Спецификатор доступа определяет, как элементы базового класса наследуются производным классом.

Производный класс может иметь доступ к открытым элементам базового класса, в том числе, вызывать его открытые функции-элементы.

Под простым наследованием понимают такое наследование, при котором один или несколько производных классов наследуют свойства одного базового класса.

Спецификаторы доступа

Доступ в базовом классе

Спецификатор доступа при наследовании

Доступ в производном классе

public

protected

private

public

public (не изменяется)

protected (не изменяется)

private (не изменяется)

public

protected

private

protected

protected

protected (не изменяется)

private (не изменяется)

public

protected

private

private

private

private

private (не изменяется)

Если при наследовании используется спецификатор доступа public, то все открытые элементы базового класса становятся открытыми элементами производного класса. При этом все закрытые элементы базового класса остаются закрытыми, и недоступны из производного класса.

При использовании спецификатора private все открытые элементы базового класса становятся закрытыми элементами производного класса, но они по-прежнему доступны для функций-элементов производного класса. Все закрытые элементы базового класса остаются закрытыми, и недоступны из производного класса.

Бывает необходимо, чтобы элементы базового класса, оставаясь закрытыми, были доступны для производного класса. Тогда используют спецификатор доступа protected. Спецификатор доступа protected эквивалентен private, с единственным исключением: защищенные элементы базового класса доступны для элементов всех производных классов этого базового класса. За пределами базового или производных классов защищенные элементы недоступны. Если базовый класс наследуется как защищенный (protected), то открытые и защищенные элементы базового класса становятся защищенными элементами производного класса.