Từ khóa explicit trong C++ được sử dụng để đánh dấu các constructor (hàm tạo) để không chuyển đổi ngầm định các loại trong C++. Nó là tùy chọn đối với các hàm tạo nhận chính xác một argument (Nó có 1 đối số hoặc có các giá trị mặc định cho tất cả các đối số khác) và hoạt động trên các hàm tạo (với một đối số duy nhất) vì đó là những hàm tạo duy nhất có thể được sử dụng trong typecasting.
Có một vài lý do tại sao bạn có thể muốn sử dụng từ khóa explicit:
- Để ngăn chặn chuyển đổi ngẫu nhiên. Ví dụ: nếu bạn có một lớp MyClass có một constructor có đối số là số nguyên, bạn có thể muốn sử dụng từ khóa explicit để ngăn ai đó vô tình chuyển đổi một chuỗi thành một đối tượng MyClass bằng cách viết MyClass c = “hello” .
- Để làm cho mã của bạn rõ ràng hơn. Nếu bạn sử dụng từ khóa explicit , sẽ rõ ràng cho người đọc mã của bạn rằng constructor không được dự định sử dụng cho các chuyển đổi ngầm.
- Để cải thiện tính an toàn kiểu. Bằng cách ngăn chặn các chuyển đổi ngầm, bạn có thể giúp đảm bảo mã của mình an toàn hơn về kiểu.
Dưới đây là một số hướng dẫn chung về khi sử dụng từ khóa explicit:
- Sử dụng từ khóa explicit cho tất cả các constructor có một đối số, trừ khi bạn muốn cụ thể cho phép các chuyển đổi ngầm.
- Sử dụng từ khóa explicit cho constructor sao chép và constructor di chuyển, ngay cả khi chúng có nhiều hơn một đối số.
- Sử dụng từ khóa explicit cho bất kỳ constructor nào mà bạn không muốn sử dụng cho các chuyển đổi ngầm.
EXAMPLE:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
#include <iostream> #include <string> struct implicit_class { implicit_class(int num) { ; } implicit_class(std::string str, int num) { ; } ~ implicit_class() { ; } }; struct explicit_class { explicit explicit_class(int num) { ; } explicit explicit_class(std::string str, int num) { ; } ~ explicit_class() { ; } }; void do_implicit(implicit_class obj) { } void do_explicit(explicit_class obj) { } int main() { ///------ Feature -------- implicit_class obj_im1 = 1; // (1).OK: copy-initialization selects implicit_class::implicit_class(int) // explicit_class obj_ex1 = 1; // (2).ERROR: copy-initialization does not consider explicit_class::explicit_class(int) implicit_class obj_im2(2); // (3).OK: direct-initialization selects implicit_class::implicit_class(int) explicit_class obj_ex2(2); // (4).OK: direct-initialization selects explicit_class::explicit_class(int) implicit_class obj_im3 = { "One",1 }; // (5).OK: copy-list-initialization selects implicit_class::implicit_class(string, int) // explicit_class obj_ex3 = { "One",1 }; // (6).ERROR: copy-list-initialization does not consider implicit_class::implicit_class(string, int) ///------- Mean ---------- do_implicit(32); // OK: because it use feature (1), although it is inexplicit. // do_explicit(32); // ERROR : because it is inexplicit. do_implicit(implicit_class(2)); // OK : because it use feature (3), it is very explicit. do_explicit(explicit_class(3)); // OK : because it use feature (4), it is very explicit. do_implicit({"One", 1 }); // OK: because it use feature (5), although it is inexplicit. // do_explicit({ "One",1 }); // ERROR : because it is inexplicit. return 0; } |
Cuối cùng, quyết định có sử dụng từ khóa explicit hay không là tùy thuộc vào bạn. Tuy nhiên, đó là một thực hành tốt để sử dụng nó bất cứ khi nào có thể để cải thiện độ rõ ràng và an toàn của mã của bạn
Download Project (VS2015):
Google Drive 1 Google Drive 2