Trình tạo bản sao là một constructor , nó tạo ra một đối tượng. Đặc biệt, các nhà xây dựng bản sao tạo ra một đối tượng mà là ngữ nghĩa giống nhau, đối tượng, trong đó nó làm cho một "bản sao" đã tồn tại:
Person newperson(oldperson); // newperson is a "copy" of oldperson
Việc chuyển nhượng hành không phải là một nhà xây dựng ở tất cả, nhưng một thành viên thông thường funcion chỉ có thể được gọi trên một đối tượng hiện có. Mục đích của nó là gán cho đối tượng của bạn ngữ nghĩa của một đối tượng khác, để sau khi phân công hai ngữ nghĩa giống nhau về mặt ngữ nghĩa. Bạn thường không "quá tải" toán tử gán, bạn chỉ định nghĩa nó.
Person p; // construct new person
/* dum-dee-doo */
p = otherperson; // assign to p the meaning of otherperson, overwriting everything it was before
// invokes p.operator=(otherperson)
Lưu ý rằng nếu nó làm cho tinh thần để so sánh với các đối tượng (với ==
), sau đó cả hai xây dựng sao chép và phân công nên cư xử để chúng tôi có sự bình đẳng sau:
Person p1(p2);
assert(p1 == p2);
p1 = p3;
assert(p1 == p3);
Bạn không bắt buộc để đảm bảo điều này, nhưng người dùng trong lớp của bạn thường sẽ giả định hành vi này. Trong thực tế, trình biên dịch giả định rằng Person p1; Person p2(p1);
đòi hỏi phải có p1 == p2;
.
Cuối cùng, như một thức sang một bên và như đã nói ở nơi khác, lưu ý rằng Person p = p2;
theo nghĩa đen có nghĩa làPerson p(p2)
(xây dựng bản sao), và không bao giờ Person p; p = p2;
.Đó là đường cú pháp để cho phép bạn viết mã trông tự nhiên mà không ảnh hưởng đến hiệu quả (hoặc thậm chí chính xác, vì lớp của bạn có thể thậm chí không được cấu hình mặc định).
Nguồn
2011-06-20 23:08:01
+1: Nhưng để tránh nhầm lẫn, câu trả lời của bạn có lẽ cũng nên bao gồm 'Person p3 = p1' làm ví dụ khác về hàm tạo bản sao. –
Vì vậy, các nhà xây dựng bản sao chỉ được sử dụng một cách rõ ràng? Không bao giờ sử dụng '='? –
@OliCharlesworth Chính xác. Tôi đang nghi ngờ về nó ... –