- 假设我们已经有了如下的类:
- 现在,需要实例化它们,传统做法是
Entity a("Cherno");
或Entity a = ("Cherno");
- 实际上,还有一种方法是
Entity a = "Cherno";
- 实际上发生的是,因为类
Entity
中有m_Age
,C++
认为22可以被隐式转换为Entity
中的m_Age
,所以C++
会调用Entity
的构造函数构造一个实例,然后将22赋给这个实例。 同样的,如果有其他函数等,接收Entity
作为参数的,也可以传入22,如void Print(const Entity& entity)
;
- 但是,
void Print("Cherno")
不可以,因为"Cherno"
实际上不是std::string
,而是一个char
数组。如果从char array
转换为Entity
,需要先转换为std::string
,这样相当于进行了两次隐式类型转换,但是C++
只允许一次隐式类型转换,所以不可以。
- 关键字
explicit
放在构造函数前,可以避免这个构造函数被隐式调用。