2012-09-27 29 views
5

Và tương tự, trình tạo bản sao mặc định có gọi hàm tạo bản sao trên tất cả các thành viên không? Ví dụ: nếu một lớp học có thành viên không phải POD như vậy:Nhà điều hành cuộc gọi gán mặc định = trên tất cả các thành viên?

class A 
{ 
    std::string str; 
}; 

... trình tạo bản sao và tác nhân gán biên dịch mặc định có hoạt động chính xác không? Họ sẽ gọi hàm tạo bản sao của chuỗi và operator= hoặc họ sẽ tạo bản sao bit của biến thành viên str?

Nói cách khác, không có thành viên std::string có nghĩa là lớp này cần người tạo bản sao do người dùng triển khai và nhà điều hành gán không?

Trả lời

5

Có, trình biên dịch được tạo sẽ hoạt động chính xác.

Tuy nhiên, nếu bạn tự triển khai và để trống thì không.

Nếu bạn không quản lý bộ nhớ và tất cả thành viên của bạn cung cấp sao chép/chuyển nhượng/hủy diệt chính xác, bạn không cần (và không nên) triển khai toán tử tạo/hủy/sao chép bản sao của riêng bạn.

Nói cách khác, không có tiêu chuẩn :: thành viên chuỗi có nghĩa là lớp này cần một người xây dựng bản sao do người dùng triển khai và toán tử gán?

Không, trình biên dịch được tạo sẽ hoạt động hoàn hảo.

+0

"Có, trình biên dịch được tạo bởi trình biên dịch sẽ hoạt động chính xác". - ngay cả đối với các lớp học với các thành viên const? –

+0

@spin_eight sau đó bản sao hoặc bài tập sẽ không biên dịch được. –

+3

@LuchianGrigore: Trên thực tế, một bản sao sẽ biên dịch. Nhiệm vụ sẽ không rõ ràng. –

Các vấn đề liên quan