Bây giờ chúng ta sẽ thực hiện thêm một thí nghiệm khác. Chúng ta sửa class Compo như sau →
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 |
#include <iostream> using namespace std; class A { public: A(A &src) { cout << "copying A..." << endl; } A(void) { } void Do(void) { cout << "A is doing something" << endl; } }; class B { public: B(B &src) { cout << "copying B..." << endl; } B(void){ } void Do(void) { cout << "B is doing something" << endl; } }; class Compo { public: Compo(Compo &src) { cout << "Copying Compo..." << endl; } Compo(void) { } ; A f1; B f2; }; int main(void) { Compo co1; Compo co2 = co1; co2.f1.Do(); co2.f2.Do(); return 0; } |
Bây giờ nó có constructor sao chép riêng của nó. Nó sẽ được gọi một lần (một các tường minh) trong suốt vòng đời của chương trình, tại thời điểm đối tượng co2 được tạo ra.
Chương trình tạo ra kết quả sau:
1 2 3 |
Copying Compo... A is doing something B is doing something |
Điều này có làm bạn ngạc nhiên không ? Copying constructor tường mình (code bởi chúng ta) đã không gọi đến các copying constructors của các class thành phần. Thật không may, việc chúng ta định nghĩa copying constructor của riêng mình có nghĩa là chúng ta phải chịu hoàn toàn chịu trách nhiệm về tất cả các hoạt động cần thiết để thực hiện việc sao chép. Điều này có nghĩa là chúng ta cần phải sửa đổi các constructor. Một cách để làm điều này là thêm một dòng như thế này:
1 |
Compo(Compo &src) : f1(src.f1), f2(src.f2) { cout << "Copying Compo..." << endl; } |
thay vì
1 |
Compo(Compo &src) { cout << "Copying Compo..." << endl; } |
Sau khi sửa như vậy, chương trình sửa đổi hoạt động theo cách chúng ta muốn và tạo ra kết quả sau:
1 2 3 4 5 |
copying A... copying B... Copying Compo... A is doing something B is doing something |