5.explicit关键字
首先,explicit表示显示的、明确的意思,与隐式的意思相反,在C++11之前,存在如下图左的隐式转换,Complex的构造函数带两个参数,但一个已经带了初值,且此处无explicit关键字,因此它实际上就是一个non-explicit, one argument constructor(无exp关键字,仅需一个实参的构造函数),此时在执行如下的c1+5时,首先调用+的操作符重载函数,然后在参数传递时,编译器会在编译期间默认调用其构造函数,将5转换为一个Complex类型的对象(re=5,im=0),因为Complex构造函数只需要一个实参,此时正好满足。
因此,有的时候为了禁止这种隐式转换,在C++11之前,采用下图右侧这种方式,加上一个explicit关键字,这个时候Complex构造函数就变成了explicit and one argument constructor(有exp关键字,只需要一个实参的构造函数),此时再次执行c1+5时,编译器报错(没有和operator+匹配的重载函数)。
下面是C++11中explicit的新特性,它将作用于需多个实参的构造函数(而非旧版本中只有一个实参的构造函数),从下图左的执行结果中看出(注释后面是执行结果),p5={77,5,42}以及下面一个报错,原因就是代码中P(int a,int b,int c)前加了explicit关键字,这里本来编译器默认会进行隐式转换(将以{77,5,42}一包形式的initializer_list转换成(int a ,int b, int c)),加上explicit就不允许隐式转换,因此报错。这里与旧版区别在于,新版的支持多个参数的构造函数,旧版只支持单个构造函数。