隐式类类型转换
可以用单个实参来调用的构造函数定义了从形参类型到该类类型的隐式转换。
1 class Animal
2 {
3 public:
4 Animal() = default;
5 explicit Animal(const string &s = ""):name(s),leg_num(0){ }
6 Animal(int i):leg_num(i){ }
7 void print_name(Animal animal);
8 private:
9 string name;
10 int leg_num;
11 };
12 void Animal::print_name(Animal animal)
13 {
14 cout << "The animal's name is " << animal.name << endl;
15 cout << animal.leg_num << endl;
16 }
例如这个类,它一共有三个构造函数,具有一个实参的两个构造函数都可以实现隐式转换,成员函数print_name接收一个Animal对象,如:
string kind = "dog";
Animal animal;
/* 这句话是错误的,因为接受字符串的构造函数声明为explicit,防止使用构造函数进行隐式转换
* 如果仍要使用的话,需要强制转换:animal.print_name(Animal(kind));
*/
animal.print_name(kind); //error
animal.print_name(2); //ok
隐式转换的对象为临时对象,函数调用结束后,这个对象就会被丢弃。