Các hàm khởi tạo sao chép (copying constructor) là một dạng của hàm khởi tạo được thiết kế để tạo ra bản sao của một đối tượng. Giả sử chúng ta có 1 class A, thì copying constructor của nó sẽ được khai báo như sau:
A (A &)
Điều này có nghĩa là hàm khởi tạo này có tham số là một tham chiếu đến một đối tượng mà nội dung của nó sẽ được sao chép vào đối tượng mới tạo ra. Việc khai báo copying constructor trong các class là không bắt buộc. Nếu không có copying constructors được khai báo tường minh thì một copying constructor ngầm định sẽ được sử dụng thay thế. Một copying constructor ngầm định chỉ đơn giản nhân bản đối tượng gốc, tạo ra một bản sao kép. Nó hoạt động tốt trong hầu hết các trường hợp, nhưng cần phải chú ý và xem xét cẩn thận khi được sử dụng với các đối tượng có chứa các đối tượng hoặc con trỏ.
Hãy bắt đầu bằng một ví dụ đơn giản →
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
#include <iostream> using namespace std; class Class { int data; public: Class(int value) : data(value) {} void increment(void) { data++; } int value(void) { return data; } }; int main(void) { Class o1(123); Class o2 = o1; Class o3(o2); o1.increment(); cout << o1.value() << endl; cout << o2.value() << endl; cout << o3.value() << endl; return 0; } |
Class được khai báo trong ví dụ trên không có copying constructor tường minh. Một copying constructor ngầm định sẽ được sử dụng. Nó sẽ được goi 2 lần trong quá trình khởi tạo các đối tượng o2 và o3. Ví dụ trên sử dụng hai cách có thể để khai báo một đối tượng, đó là sử dụng toán tử = trong phép gán cổ điển và sử dụng functional notation (dịch sang tiếng Việt nôm na là ký hiệu hàm).
Các đối tượng o2 và o3 sẽ được tạo ra như là các bản sao kép của các đối tượng o1 và o2 tương ứng, nhưng chúng ta cần nhấn mạnh rằng ba đối tượng này sử dụng chung bất cứ thứ gì. Mỗi đối tượng có dữ liệu riêng của mình, cả ba đối tượng đều sống cuộc sống riêng của chúng.
Việc gọi hàm increment của đối tượng o1 không gây ảnh hưởng đến o2 và o3.
Kết quả của chương trình như sau:
1 2 3 |
124 123 123 |