Đầu tiên, bất kỳ công cụ xây dựng nào đều có thể được đánh dấu explicit
. Làm thế nào nhiều đối số nó có là không liên quan.
Bằng cách đó, bạn chỉ cần hiểu những gì explicit
thực sự có nghĩa là. Nó chỉ có nghĩa là cách duy nhất mà nhà xây dựng có thể được gọi là khi bạn rõ ràng ghi rõ tên lớp:
struct foo
{
foo(int){}
explicit foo(double){}
};
void bar(foo){}
bar(5); // okay, calls foo(int) to construct the foo
bar(3.14); // error, cannot call foo(double) because foo was not explicitly used
bar(foo(3.14)); // okay, calls foo(double) to construct the foo
Lý do chúng tôi không đánh dấu nhà xây dựng nhiều lập luận rõ ràng là bởi vì nó vô dụng. Given:
struct baz
{
baz(int, int, int);
};
Làm cách nào khác bạn có thể gọi hàm tạo khác ngoài nói baz
? (Như trong baz(1, 2, 3)
.) †
Trong ví dụ của bạn, explicit
sẽ hợp lý vì bạn có thể gọi hàm tạo đó chỉ với một đối số. Những gì bạn thực sự làm chỉ phụ thuộc vào nếu bạn cảm thấy nó nên được ngầm chuyển đổi hay không.
† Việc này bỏ qua danh sách khởi tạo C++ 11. Trong C++ 11, tôi nghĩ rằng bạn có thể nói:
void qaz(baz) {}
qaz({1, 2, 3});
Và quản lý để có được một chuyển đổi ngầm để một constructor nhiều tranh cãi, nhưng tôi không biết đủ về initializer-danh sách để thực hiện một bình luận có ý nghĩa trừ dưới dạng chú thích cuối trang.
Trình tạo nội dung rõ ràng có ý nghĩa khác. Những gì bạn đang nói về constructor với các đối số mặc định. – Mahesh
@mahesh Tôi biết ý nghĩa của các nhà xây dựng rõ ràng và câu hỏi là một câu hỏi :) Được rồi, tôi sẽ điền nó với một ví dụ. – Ockonal
Không ai trong số đó là các nhà xây dựng rõ ràng - chúng không được đánh dấu bằng từ khoá 'tường minh'. Bạn có nghĩa là * implicit * constructor? Nếu có, có, các hàm tạo có thể được gọi ngầm nếu các tham số n + 1 được gán các đối số mặc định. –