隐式类类型转换:可以用 单个形参来调用 的构造函数定义了从 形参类型 到 该类类型 的一个隐式转换
1 class Person 2 { 3 public: 4 Person(string name,int age = 10): mName()name, mAge(age){}; 5 bool isSameName(const Person & person){ 6 return person.mName == mName; 7 } 8 private: 9 string mName; 10 int mAge; 11 } 12 int main() 13 { 14 Person A(A-A-A); 15 Person B(B-B-B); 16 cout<<A.isSameName<<endl;//正常调用 17 cout<<String(A-A-A)<<endl;//调用隐式类类型转换 传进参数稳string类型然而isSaneName()的参数为Person类型
//即string 调用了Person默认构造函数 以满足isSameName的函数期待 18 19 system("pause"); 20 }
用explicit可以避免以上现象发生
总结
- 可以使用一个实参进行调用,不是指构造函数只能有一个形参
- 隐式类类型转换容易引起错误,除非你有明确理由使用隐式类类型转换,否则,将可以用一个实参进行调用的构造函数都声明为explicit。
- explicit只能用于类内部构造函数的声明。它虽然能避免隐式类型转换带来的问题,但需要用户能够显式创建临时对象(对用户提出了要求)。