2010-05-07 7 views
13

Theo như tôi biết, trình tạo bản sao phải có dạng T(const T&) hoặc T(T&). Nếu tôi muốn thêm đối số mặc định vào chữ ký thì sao?hàm tạo bản sao với đối số mặc định

T(const T&, double f = 1.0); 

Đó có phải là tiêu chuẩn tuân thủ không?

+0

Xem [PR này] (http://llvm.org/bugs/show_bug.cgi?id=5989) tôi đã gửi đến một vài lần trước khi một số trò chơi để chơi với điều đó. –

+0

http://punchlet.wordpress.com/2009/12/03/letter-the-third/ –

Trả lời

25

Có.

§ [class.copy]/2:

Một phi mẫu constructor cho lớp X là một bản sao constructor nếu tham số đầu tiên của nó là loại X&, const X&, volatile X& hoặc const volatile X&, và một trong hai không có tham số khác hoặc các tham số khác có đối số mặc định [Ví dụ:X::X(const X&)X::X(X&,int=1) là các hàm tạo bản sao.

6

Bạn chỉ có thể tạo ra hai cấu trúc khác nhau:

T(const T&) 
T(const T&,double) 

Tuy nhiên, những gì bạn có được phép như một constructor sao chép. Trên một mặt lưu ý, tôi đã phát hiện ra rằng không nên sử dụng các tham số mặc định trong C++ và thay vào đó sử dụng quá tải tốt hơn, ở đó những thông số quá tải sẽ gọi các tham số có nhiều tham số hơn, sử dụng các giá trị mặc định (tất nhiên là không thể với các hàm tạo trong ISO C++ 2003, nhưng các hàm tạo ủy nhiệm được cho phép trong ISO C++ 201x). Lý do cho điều này là các giá trị mặc định cho các chức năng của bạn các chữ ký thực tế khác với hành vi rõ ràng của chúng, làm cho nó hơi khó khăn/đau đớn khi lấy các con trỏ đến các hàm. Bằng cách cung cấp quá tải, các con trỏ hàm của từng kiểu gọi có thể được thực hiện mà không yêu cầu bất kỳ loại cơ chế "ràng buộc" nào để làm cho nó hoạt động.

+1

Điểm tốt. Lấy địa chỉ của các chức năng quá tải cũng là một nỗi đau, IMO, nhưng ít nhất nó hoạt động. – UncleBens