Giả sử đã định nghĩa một lớp nào đó, ví dụ lớp PS (phân số). Khi đó:
+ Ta có thể dùng câu lệnh khai báo hoặc cấp phát bộ nhớ để tạo các đối tượng mới, ví dụ:
PS p1, p2 ;
PS *p = new PS ;
+ Ta cũng có thể dùng lệnh khai báo để tạo một đối tượng mới từ một đối tượng đã tồn tại, ví dụ:
PS u;
PS v(u) ; // Tạo v theo u
ý nghĩa của câu lệnh này như sau:
− Nếu trong lớp PS chưa xây dựng hàm tạo sao chép, thì câu lệnh này sẽ gọi tới một hàm tạo sao chép mặc định (của C++). Hàm này sẽ sao chép nội dung từng bit của u vào các bit tương ứng của v. Như vậy các vùng nhớ của u và v sẽ có nội dung như nhau. Rõ ràng trong đa số các trường hợp, nếu lớp không có các thuộc tính kiểu con trỏ hay tham chiếu, thì việc dùng các hàm tạo sao chép mặc định (để tạo ra một đối tượng mới có nội dung như một đối tượng cho trước) là đủ và không cần xây dựng một hàm tạo sao chép mới.
− Nếu trong lớp PS đã có hàm tạo sao chép (cách viết sẽ nói sau) thì câu lệnh: PS v(u); sẽ tạo ra đối tượng mới v, sau đó gọi tới hàm tạo sao chép để khởi gán v theo u.
Ví dụ sau sẽ minh họa cách dùng hàm tạo sao chép mặc định: Trong chương trình đưa vào lớp PS (phân số):
+ Các thuộc tính gồm: t (tử số) và m (mẫu).
+ Trong lớp không có phương thức nào cả mà chỉ có 2 hàm bạn là các hàm toán tử nhập (>>) và xuất (<<).
+ Nội dung chương trình là: Dùng lệnh khai báo để tạo một đối tượng u (kiểu PS) có nội dung như đối tượng đã có d.
#include <conio.h> #include <iostream.h> class PS { private: int t, m ; public:
friend ostream& operator<< (ostream&os, const PS &p) {
os << " = " << p.t << "/" << p.m; return os;
}
friend istream& operator>> (istream& is, PS &p) {
cout << "\n Nhap tu va mau: " ; is >> p.t >> p.m ; return is; } } ; void main() { PS d;
cout << "\n Nhap PS d "; cin >> d; cout << "\n PS d " << d;
PS u(d);
cout << "\n PS u "<< u; getch();
}