- class T{
- public:
- int a;
- int b;
- T();
- ~T();
- T(int iFirst, int iSecond = 4);
- };
- T():a(0),b(0)
- {
- }
- T::T(int iFirst, int iSecond):a(iFirst), b(iSecond)
- {
- }
- int main(int argc, char* argv[])
- {
- T q; //调用T()
- T w(12,34); //调用T(int ,int)
- T u(22); //调用T(int, int)
- T l=89; //调用T(int, int)
- //上行代码执行了隐式转换, 89-> T temp(89) 然后 T l =temp,拷贝构造
- return 0;
- }
隐式转换总是在我们没有察觉的情况下悄悄发生,除非有心所为,隐式转换常常是我们所不希望发生的。通过将构造函数声明为explicit(显式)的方式可以抑制隐式转换。也就是说,explicit构造函数必须显式调用。
发生隐式转换,除非有心利用,隐式转换常常带来程序逻辑的错误,而且这种错误一旦发生是很难察觉的。
原则上应该在所有的构造函数前加explicit关键字,当你有心利用隐式转换的时候再去解除explicit,这样可以大大减少错误的发生。