Нека изследваме разликата между конструктора на копиране и оператора на присвояване.
Сравнителна таблица
Основа за сравнение | Копирай конструктора | Оператор по присвояване |
---|---|---|
Основен | Конструкторът на копиране е претоварен конструктор. | Операторът на присвояване е битова операция. |
значение | Конструкторът за копиране инициализира новия обект с вече съществуващ обект. | Операторът за присвояване присвоява стойността на един обект на друг обект, който вече съществува. |
Синтаксис | име_на_клас (cont class_name & object_name) { // тялото на конструктора } | class_name Ob1, Ob2; OB2 = OB1; |
позовава | (1) Копиращ конструктор се извиква, когато нов обект се инициализира със съществуващ. (2) Обектът се предава на функция като не-референтен параметър. (3) Обектът се връща от функцията. | Операторът на присвояване се извиква само когато присвоите съществуващия обект на нов обект. |
Разпределение на паметта | Както целевият обект, така и инициализиращият обект споделят различните места в паметта. | Както целевият обект, така и инициализиращият обект споделят една и съща разпределена памет. |
По подразбиране | Ако не дефинирате конструктор за копиране в програмата, компилаторът на C ++ я предоставя. | Ако не претоварвате оператора "=", ще бъде направено побитово копие. |
Определение на копие конструктор
"Конструктор на копие" е форма на претоварен конструктор . Конструкторът за копиране се извиква или извиква само за целите на инициализация. Конструкторът за копиране инициализира новосъздадения обект от друг съществуващ обект. Когато се използва конструктор за копиране за инициализиране на новосъздадения целеви обект, тогава и целевият обект, и източникът обект споделят различно място в паметта. Промените, направени за изходния обект, не се отразяват в целевия обект. Общата форма на конструктора за копиране е
class_ име (class_name & object_name) {. // тяло на конструктора за копиране. } // object_name се отнася до обекта от дясната страна на инициализацията.
Ако програмистът не създава конструктор за копиране в програма C ++, тогава компилаторът по подразбиране осигурява конструктор за копиране. Имплицитен конструктор за копиране, предоставен от компилатора, прави копие на изходния обект. Но понякога копието на членовете не е достатъчно, тъй като обектът може да съдържа променлива на показалеца. Копиране на променлива на показалеца означава, че копираме адреса, съхраняван в променливата на показалеца, но не искаме да копираме адреса, съхраняван в променливата на показалеца, вместо това искаме да копираме указателя към указателя. Следователно, има нужда от изричен "конструктор за копиране" в програмата за решаване на този вид проблеми.
Конструкторът за копиране се извиква в три условия, както следва:
- Копирай конструктора, когато нов обект се инициализира със съществуващ.
- Обектът се предава на функция като не-референтен параметър.
- Обектът се връща от функцията.
Нека разберем конструктора на копие с пример.
копие на клас {int num; public: copy () {} // копие на конструктора по подразбиране (int a) {// инициализиращ конструктор num = a; } copy (copy & c) {// Копие конструктор num = c.num; } void show () {cout << num; }}; int main () {копие А (200); // Обект A е създаден и инициализирано копие B (A); // Копие конструктор наречен копие C = A; // Копие конструктор наречен копие D; D = А; // копие конструктор не се нарича, защото обект D не новосъздаден обект. // това е операция по присвояване. return 0; }
В горния код изрично обявих конструктор „копие (копие & c)“. Този конструктор за копиране се извиква, когато обект В се инициализира с обект А. За втори път той се извиква, когато обект С се инициализира с обект А. Когато обект D се инициализира с обект А, конструкторът за копиране не се извиква, защото когато D се инициализира то вече е в съществуването, а не в новосъздаденото. Следователно тук се извиква операторът за присвояване.
Определение на оператор на назначение
Операторът за присвояване е оператор на C ++. Операторът "=" се използва за извикване на оператора на присвояване. Той копира данните в един обект идентично на друг обект. Операторът по присвояване копира един обект на друг член. Ако не претоварвате оператора на присвояване, той изпълнява битовото копие. Затова трябва да претоварвате оператора за присвояване.
копие на клас {int num; public: copy () {} // копие на конструктора по подразбиране (int a) {// инициализиращ конструктор num = a; } void show () {cout << num; }}; int main () {копие А (200); // Обект A е създаден и инициализирано копие B (300); // Обект B е създаден и инициализиран B = A; // операторът на присвояване копие C; С = А; // присвояваният оператор връщане 0; }
В по-горния код, когато objectA е присвоен на обект B, операторът на присвояване се извиква, тъй като и двата обекта вече съществуват. По същия начин, същият е случаят, когато обект С е инициализиран с обект А.
Когато се извършва битово присвояване, обектът споделя едно и също място на паметта и промените в един обект се отразяват в друг обект.
Ключови разлики между копиращия конструктор и оператора по присвояване
- Конструкторът за копиране е претоварен конструктор, където като оператор на присвояване е битова операция.
- С помощта на конструктор за копиране можете да инициализирате нов обект с вече съществуващ обект. От друга страна, операторът по присвояване копира един обект на другия обект, като и двата вече съществуват.
- Конструкцията за копиране се инициализира всеки път, когато нов обект се инициализира с вече съществуващ обект, когато даден обект се предава на функция като параметър без рефренция, или когато обект се връща от функция. От друга страна, операторът за присвояване се извиква само когато обект се присвоява на друг обект.
- Когато даден обект се инициализира, използвайки конструктор на копиране, инициализиращият обект и инициализираният обект споделят различното място на паметта. От друга страна, когато даден обект се инициализира с оператор за присвояване, тогава инициализираните и инициализиращите обекти споделят едно и също място на паметта.
- Ако не дефинирате изрично конструктор за копиране, компилаторът го предоставя. От друга страна, ако не претоварвате оператор на АС, тогава се извършва операция по битово копиране.
Заключение:
Конструкторът на копиране е най-подходящ за копиране на един обект в друг, когато обектът съдържа необработени указатели.