Site Tools


c_copyconstructor

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
c_copyconstructor [2013/04/11 00:16]
konovalov
c_copyconstructor [2013/04/11 00:20] (current)
konovalov
Line 1: Line 1:
-==== Требования ==== +Желательно обратиться к странице [[c_specialmemberfunctions]]
-  MyClass(const MyClass &​copy){/​*реализация*/​} +
-в качестве параметра обязательно ​должна передаваться по ссылки (без копирования) (TODO: по указателю можно?​), ​иначе, копия объекта будет рекурсивно замкнута. +
-\\ +
-\\ +
- +
-В операторе присвоения следует проверять (&copy == this) и если объект копирует сам себя (obj1 = obj1) принимать соответствующие действия. +
-       // по соглашению всегда возвращаем *this +
-        return *this; +
-  array_1 = array_2 = array_3; +
- +
-==== Пример ==== +
- #include "​stdafx.h"​ +
- #include <​iostream>​ +
- #include <​string>​ +
- using namespace std; +
-  +
- class MyClass{ +
- public: +
- int i; +
- int *iMass; +
- MyClass(const int inI) : i(inI), iMass(new int[i]){} +
- MyClass(const MyClass &copy) : i(copy.i), iMass(new int[copy.i]){ //конструктор копирования +
- std::​copy(copy.iMass,​ copy.iMass + copy.i, iMass); +
- cout << "copy constructor"​ << endl; +
-+
- ~MyClass(){ +
- delete[] iMass; +
-+
- }; +
-  +
- int _tmain(int argc, _TCHAR* argv[]+
-+
-  +
- MyClass obj1(3); +
- MyClass obj2(4); +
-  +
- obj1.iMass[0= 4; +
- obj1.iMass[1] = 6; +
- obj1.iMass[2] = 8; +
-  +
- cout << "obj1: "; +
- for(int i = 0; i < 3; i++){ +
- cout << obj1.iMass[i] << " "; +
-+
- cout << endl; +
-  +
-+
- MyClass obj3(obj1);​ +
- cout << "obj3 after copyConstructor:​ "; +
- for(int i = 0; i < 3; i++){ +
- cout << obj3.iMass[i] << " "; +
-+
- cout << endl; +
-+
-  +
- cout << "obj1 after delete obj3: "; +
- for(int i = 0; i < 3; i++){ +
- cout << obj1.iMass[i] << " "; +
-+
- cout << endl; +
-  +
- string endString;​ +
- cin >> endString;​ +
- return false; +
-+
-вывод +
-  obj1: 4 6 8 +
-  copy constructor +
-  obj3 after copyConstructor:​ 4 6 8 +
-  obj1 after delete obj3: 4 6 8 +
- +
-если заккоментировать код конструктора копирования,​ то вывод будет:​ +
-  obj1: 4 6 8 +
-  obj3 after copyConstructor:​ 4 6 8 +
-  obj1 after delete obj3: -17891602 -17891602 -17891602 +
-так как, указатель(массив) iMass будет скопировал конструктором по умолчания как ссылка и разрушен деструктором.\\ +
- +
-Так же и с оператором присвоения:​ +
- int operator = (const MyClass &​copy){ +
- i = copy.i; +
- iMass = new int[copy.i];​ +
- std::​copy(copy.iMass,​ copy.iMass + copy.i, iMass); +
- cout << "​operator = " << endl; +
- return 1; +
-+
-иначе конструкция obj3 = obj1; выполнит реализацию по умолчанию и так же произведет копирование адреса указателя.+
c_copyconstructor.txt · Last modified: 2013/04/11 00:20 by konovalov

Page Tools