指定构造函数或转换函数为显示,即不能用于隐式转化;
一般出现在类定义之内的构造函数中;
如:
class P { explict P(){}; };
#include <iostream> class Test { public: Test(int a):a_(a) { std::cout << "Test()" << std::endl; // 通过打印看调用几次构造函数 } int Get_Data() { return a_; } Test operator + (Test t) { return Test(a_ + t.a_); } private: int a_; }; int main() { Test t1{3}; Test t2 = t1 + 5; // 5 会隐式的调用的Test构造函数 std::cout << t2.Get_Data() << std::endl; //输出 8 }
在上一个的例子的基础之上加上 explict
#include <iostream> class Test { public: explicit Test(int a):a_(a) { std::cout << "Test()" << std::endl; // 通过打印看调用几次构造函数 } int Get_Data() { return a_; } Test operator + (Test t) { return Test(a_ + t.a_); } private: int a_; }; int main() { Test t1{3}; Test t2 = t1 + 5; //error // error: no match for 'operator+' (operand types are 'Test' and 'int') //说明 5 还是个int类型, 不能隐式的转化为Test }
explicit用于多个参数
#include <iostream> struct P { P(int a, int b) { std::cout << "P(int a, int b)" << std::endl; } explicit P(int a, int b, int c) { std::cout << "explicit P(int a, int b, int c)" << std::endl; } }; int main() { P p1(1,2); //OK P(int a, int b) P p2{1,2}; //OK P(int a, int b) P p3 = {1,2}; //OK P(int a, int b) P p4(1,2,3); //OK explicit P(int a, int b, int c) P p5{1,2,3}; //OK explicit P(int a, int b, int c) P p6 = {1,2,3}; //error:converting to 'P' from initializer list would use explicit constructor 'P::P(int, int, int) }