Từ khóa explicit trong C++ được sử dụng để đánh dấu các 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.
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; } |
Download Project (VS2015):
Google Drive 1 Google Drive 2