explicit是在类里面声明构造函数的,它的作用是可以防止对象间的隐式转换。被声明为explicit的构造函数通常比其非explicit更受欢迎,因为它们禁止编译器执行非预期的类型转换。除非有一个好理由允许构造函数被用于隐式类型转换,否则我会把它声明为explicit。 例如: class Dog { public: Dog() {} /* explicit */ Dog(int i) {} void func(Dog dog) { } }; int _tmain(int argc, _TCHAR* argv[]) { Dog dog; dog.func(10); //ok,因为构造函数没有添加explicit /* ** 上面的语句等于 ** Dog temp(10); ** Dog dog = temp; */ //当构造函数添加上了explicit的时候, //上面的函数调用就会发生错误,因为 //explicit关键字禁止了对象之间的隐式转换 //即禁止产生临时对象。 //解决办法可以这样:dog.func(Dog(10)); system("pause"); return 0; }