1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
//Листинг #1 Конструктор копирования. Причины использования Borland C++ 3.1 #include <iostream.h> #include <stdlib.h> /*СТРУКТУРА МАССИВ*/ struct Array { int *element; //Указатель на int Array(int N); //Конструктор структуры, принимающий параметр типа int ~Array(); //Деструктор структуры для освобождения памяти }; Array::Array(int N) //Описываю конструктор вне структуры { element = new int[N]; //При каждом новом вызове будет выделяться новый участок памяти размером согласно принимаемому параметру } Array::~Array() //Описываю деструктор вне структуры { delete []element; //Освобождаю память, выделенную внутри конструктора } int main() { system("CLS"); //очистка экрана Array v(3); //Объявляю переменную v, тип которой наша структура и выделяю память для 3 элементов int v.element[0] = 20; //Записываю в переменную v значения v.element[1] = 30; v.element[2] = 40; Array x = v; //Объявляю переменную x, тип которой наша структура и копирую туда данные из v cout << x.element[0] << " " << x.element[1] << " " << x.element[2] << endl; //Вывожу на экран элементы x v.element[0]=100; //Например, появилась необходимость изменить объект v cout << x.element[0] << " " << x.element[1] << " " << x.element[2] << endl; //Вывожу на экран элементы x cin.get(); return 0; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
//Листинг #2 Конструктор копирования. Причины использования Borland C++ 3.1 #include <iostream.h> #include <stdlib.h> /*СТРУКТУРА МАССИВ*/ 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]; //Поэлементно копирую каждый элемент из принимаемого объекта в текущий size = obj.size; //скопировать нужно каждый кусочек класса, сами они не копируются } 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; } |
int main()
void наверное хотел написать)
отличная статья, спасибо!
😈 😆 😕 😀 ❗ 🙁 😛 😐 😥 😉 😯 😳 ❗ 🙁
спасибо за статью 😛
Спасибо вам большое за статью, немного хоть понятнее стало 🙂
В конструкторе копирования не инициализируете поле size нового объекта. Должно быть упустили.
Ещё можно оператор присваивания переопределить
Спасибо
Самое толковое (и не растянутое) описание работы конструктора копирования, и того — зачем он нужен.
НИЧЕГО НЕПОНЯТНО! СЛОЖНАААА!
Отлично написано. спасибо )