C++是一种复杂的语言,其中有许多“好玩”的特性,学习C++的过程像在海边捡一颗颗石头,只要坚持不懈,也许一颗颗小石头也能建起你自己小小的城堡。
  废话完后,讲讲自己捡到的石头:隐式类型转换
  学习出处:《Effective C++》 lostmouse大人翻译
class TestInt
{
public:
int GetData()const{ return i;};
TestInt(int ii):i(ii){}; //构造函数
private:
int i;
};
void fun(TestInt t)
{
cout<<t.GetData()<<endl;
}
int main()
{
fun(10);
return 0;
}
  运行结果:
  10
  为啥fun函数需要的是TestInt的类型的参数,而传进去int 也可以呢,
  寻找原因之前,我们先把构造函数注释掉,再重新编译,结果这次直接报错error: conversion from ‘int’ to non-scalar type ‘TestInt
  好像有点眉目了,之前能够调用成功估计和类的这个构造函数有关,其实这是C++中的隐式类型转换:
  编译器知道传个fun的值是int而函数需要的是TestInt,但他也同时知道调用TestInt的构造函数将int转换成一个合适的TestInt,
  我们知道函数传值是会生成一个临时变量,现在的情况类似 const TestInt t(10),所以结果如上面所示。
  《Effective C++》中一个例子:
  class Month {
  public:
  static const Month Jan() { return 1; }
  static const Month Feb() { return 2; }
  ...
  static const Month Dec() { return 12; }
  int asInt() const           // 为了方便,使Month
  { return monthNumber; }     // 可以被转换为int
  private:
  Month(int number): monthNumber(number) {}
  const int monthNumber;
  };
  一开始不明白如何调用这个类,而且对 static const Month Jan() { return 1; }
  这个函数的返回值有很大的疑问,为啥返回类型是Month,但函数能返回一个int呢。
  想不通,只好敲进编译器试错,经过一次次的出错,终于弄清这个类的用法,
  其实这个类是想得到一个const的月份:Month jan = Month::Jan(); 这样得到代表一月份的对象。
  而 static const Month Jan() { return 1; } 能够成功是利用了隐式类型转换,只是现在的构造函数是
  私有的,为的是防止用户创建新的month。