1、若构造函数只接受一个实参,则它实际上定义了转换为此类类型的隐式转换机制,这种构造函数又称作转换构造函数。
2、能通过一个实参调用的构造函数定义了该参数类型向类类型隐式转换的规则。也就是说,若定义了只接受一个实参的构造函数,那么可以用这种参数类型去替换原本需要类类型的地方,当我们使用了这个实参类型,该构造函数就会创建一个临时对象,使用后就没了。
3、编译器只能自动地执行一步类型。因此我们可以创建一个临时的对象,用该对象去替换,或者使用一个强制转换转换成转换构造函数的实参类型,或者原本需要的类类型。
4、若要抑制上述的这种类型隐式转换,可以使用关键字explicit放在构造函数声明前。并且该关键字只适合用于转换构造函数,只能在类内声明构造函数使用,不能在定义时候使用。但是我们可以使用显式的强制类型转换转换成类类型,转换后的类类型对象也是临时对象。
5、explicit构造函数只能用于直接初始化,就是说不能用在=的拷贝初始化。
6、接受一个const char *类型的string构造函数不是explicit的;接受一个容量参数的vector构造函数,是explicit。
7、若需要进行隐式转换的两个类型的语义相差较大,建议抑制其隐式转换机制;若相差不大,或者能自然而然地转换,那么就不用抑制其隐式转换机制。