6.5.2 Hàm khởi tạo sao chép – copying constructors (2)

Bây giờ chúng tôi sẽ cho bạn thấy nếu lúc nào cũng tin tưởng vào copying constructor ngầm định thì có thể gây nguy hiểm và các hiệu ứng bất lợi cho chương trình. Hãy xem ví dụ →

Chúng tôi đã sửa đổi lớp Class một chút. Interface của nó (interface của 1 class là từ dùng để chỉ khai báo của các hàm trong class đó, bao gồm kiểu dữ liệu của các tham số và kiểu trả về) vẫn giữ nguyên và các hàm được cung cấp bởi lớp vẫn như cũ. Chúng tôi chỉ thay đổi thực hiện (implementation) của lớp – bây giờ dữ liệu không được lưu trữ trong một biến thông thường mà ở trong một vùng nhớ được cấp phát bởi toán tử new.

Trường data của lớp Class được khai báo là một con trỏ tới các giá trị int (nói cách khác, đó là một biến kiểu int *).

Chúng ta đã biết rằng copying constructor ngầm định sẽ tạo ra một bản sao kép của một đối tượng. Lưu ý rằng đây là của một đối tượng, chứ không phải các thực thể tồn tại bên ngoài đối tượng. Điều này có nghĩa là trường data sẽ được sao chép vào đối tượng mới tạo, kết quả là nó sẽ trỏ đến cùng vùng nhớ được trỏ bởi trường data của đối tượng gốc. Điều này cũng có nghĩa là các đối tượng khác nhau có thể chia sẻ hay dùng chung dữ liệu.

Điều này không phải luôn luôn là sai và luôn luôn gây rắc rối. Nếu bạn đã hiểu bản chất của nó và đang cố tình thực hiện nó một cách có mục đích, nó có thể hữu ích và tiện dụng. Nhưng nếu bạn đã làm điều đó một cách vô tình hoặc ngẫu nhiên, nó có thể gây ra lỗi và sẽ rất rườm rà, khó chẩn đoán.

Ví dụ trên sẽ tạo ra kết quả sau: