Lập trình

Lập trình

Thứ Sáu, 13 tháng 6, 2014

Hàm tạo sao chép (Copy Constructor) : Định nghĩa , cách thức hoạt động cơ bản

Hàm tạo sao chép (Copy Constructor) : Định nghĩa , cách thức hoạt động cơ bản

Trong luc lập trình với lớp rất nhiều khi ta cần tạo một đối tượng mới có dữ liệu giống với những
đối tượng đã được thành lập từ trước , để giải quyết vấn đề này c++ có cách thức : Hàm tạo sao chép (Copy Constructor)

Ta đã có những cách khai báo đối tượng như sau :
Ten_class dt1,dt2;
TenClass * p = new TenClass;

Và đây là cách khai báo đối tượng theo kiểu Hàm tạo sao chép (Copy Constructor) :
TenClass dt3; // Tạo đối tượng dt3.
TenClass dt4(dt3); // Tạo dt4 theo dt3

Khi gặp dòng trên chương trình tạo ra một đối tượng dt4 ,cấp phát bộ nhớ cho nó kiểu TenClass
và sao chép toàn bộ dữ liệu(từng bit) của dt3 vào dt4 , người ta gọi đó là hàm tạo sao chép mặc định
. Ta thấy trong đa số các trường hợp (không có con trỏ và tham chiếu ) thì chỉ cần hàm sao chép
mặc định là đủ . Nhưng thực tế có rất nhiều những trường hợp có dữ liệu kiểu
 con trỏ (mảng,cấp phát động,...) ,tham chiếu thì ta không thể dùng cách này
(trường hợp này nói sau) .

Cách xây dựng hàm tạo sao chép:
Hàm tạo sao chép sử dụng đối kiểu tham chiếu để khởi gán cho đối tượng mới :

Ten_class(Ten_class & dt1){
    ...... // Những lệnh làm việc với thuộc tính dt1 để tạo đối tượng mới.
    }

Ta thấy khi không có con trỏ và tham chiếu chỉ cần hàm mặc định là đủ (không cần khai báo)
chỉ cần : TenClass dt1(dt); //dt đã được làm việc qua.

Nhưng khi thuộc tính có kiểu con trỏ , nếu ta dùng hàm mặc định khi đó 2 thuộc tính con trỏ
của 2 đối tượng trên sẽ cùng trỏ tới một ô nhớ khi đó nếu thay đổi con trỏ của đối tượng này thì con trỏ
của đối tượng kia sẽ thay đổi , thậm chí khi ta xóa (delete) vùng nhớ của con trỏ này thì cũng
đồng nghĩa con trỏ kia cũng bị xóa (NULL)

Như vậy chỉ dùng hàm tạo sao chép mặc định thôi là chưa đủ .

Còn tại sao kiểu đối truyền vào của Copy Constructor là tham chiếu thì sau này có time mình sẽ làm tut mới về vẫn đề này .

Không có nhận xét nào:

Đăng nhận xét