Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






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






 

Если тип двух программных объектов одинаков, то один объект можно присвоить другому. По умолчанию, когда один объект присваивается другому, делается поразрядная копия всех данных-членов копируемого объекта. Особенностью операции присваивания является то что, если в объекте содержится динамически выделенная память, то при выполнении стандартной операции присваивания произойдет побитовое копирование данных одного объекта в другой, в том числе и указательных переменных, и получится, что два объекта ссылаются на одну и ту же область в динамической памяти. На практике такая ситуация может возникнуть когда необходимо выполнить присваивание одного динамического массива другому, а также при использовании указателей для передачи или возвращения объектов в функцию. Поэтому необходимо перегружать операцию присваивания. В данном случае при перегрузке операции присваивания параметром функции-оператора является объект, содержащий динамически выделенную память. При передаче фактических параметров к формальным параметрам функции происходит копирование объектов, однако копирование динамической памяти не происходит. При выходе из функции срабатывает деструктор, который удаляет объект и пытается удалить динамическую память, которая одновременно является и динамической памятью для объекта в основной программе. Это приведет к повреждению объекта. Для решения проблемы мы должны создать особый тип конструктора – конструктор копирования, в котором описать правило копирования. Дополним созданный выше класс dinamicArray методами, позволяющими выполнять операцию присваивания для динамических массивов.

class dinamicArray{

int lenght; // размер

int*a; //указатель на массив в динамической памяти

public: dinamicArray(){a=NULL; }; //конструктор без параметров

dinamicArray(int n); //конструктор с параметрами

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

void output(); //вывод массива

~dinamicArray(){delete a; }; //деструктор

// переопределение оператора присваивания

dinamicArray & operator=(dinamicArray & obj);

};

dinamicArray:: dinamicArray(int n){//конструктор

lenght=n; //устанавливаем длину

a=new int[n]; // выделяем память

for(int i=0; i< lenght; i++)a[i]=i;

}

dinamicArray:: dinamicArray(const dinamicArray & obj){

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

lenght=obj.lenght; //устанавливаем длину

a=new int[obj.lenght]; // выделяем память

//переписываем элементы массива

for(int i=0; i< obj.lenght; i++)a[i]=obj.a[i];

}

void dinamicArray:: output(){//вывод элементов массива

cout< < endl;

for(int i=0; i< lenght; i++)cout< < a[i]< < " ";

}

dinamicArray & dinamicArray:: operator=(dinamicArray & obj){

//переопределение оператора присваивания

if (lenght! =obj.lenght){//если длина неодинаковая, то изменяем длину

delete a; //удаляем память у объекта слева от =

/*Для объекта стоящего слева от знака равно выделяем новую память размером как у объекта стоящего справа от знака =*/

a=new int[obj.lenght];

lenght=obj.lenght; //устанавливаем длину объекту слева от =

}

for (int i=0; i< lenght; i++){//переписываем значения

a[i]=obj.a[i];

}

return *this;

}

void main(){

dinamicArray A(5), B; // создаем два массива

cout< < endl< < " Array A";

A.output(); //выводим массив A

B=A; // присваиваем массиву B массив A

cout< < endl< < " Array B";

B.output(); //выводим массив B

}

Объект (переменную типа класса) можно использовать в качестве аргументов функции. Объекты передаются в функции по значению, то есть в функцию передаётся не сам объект, а его копия. Это значит, что любые изменения, происходящие с элементами объекта внутри функции, не изменяют самого объекта. Для того, чтобы данные класса dinamicArray изменились в основной программе необходимо передать в функцию не копию объекта, а сам объект. Для этого передаётся ссылка на объект (адрес этого объекта). В приведённом примере объект передается по ссылке в конструкторе копирования следующим образом: dinamicArray(const dinamicArray & obj);.

Во время выполнения операции присваивания сначала вызывается функция, переопределяющая оператор = из класса dinamicArray, которая в свою очередь для передачи параметров использует конструктор копирования.






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.