C++ Primer 第四版中文版409的13.1.2中说复制构造函数“因为用于向函数传递对象和从函数返回对象,该构造函数一般不应该设置为explicit”,想了半天这句话,没有一个所以然来。实际操作一下: 在VC++6.0编译器中,尝试在复制构造函数前面加上explicit修饰(explicit classA(const classA& ma)),如果不执行classA obj5 = obj2这种类型的复制初始化操作,可以编译通过。如果有这条语句就会报“cannot convert from 'class classA' to 'class classA'。No copy constructor available for class 'classA'”,这个错误提示模糊,很难理解。 在VC++2008(VC9.0)编译器中,尝试在复制构造函数前面加上explicit修饰,如果不执行classA obj5 = obj2这种类型的复制初始化操作,还是可以编译通过。如果有这条语句就会报“ no copy constructor available or copy constructor is declared 'explicit'”,这个错误提示就明晰很多。 通过上述的理解,如果构造函数(带单参数的构造函数和复制构造函数)前面用explicit修饰:explicit classA(Type a),其中Type是参数类型。那么编译器就会不执行这种类型的操作:classA obj = a,只能是显式的使用直接初始化操作:classA obj(a) 。这样子就能够解释为什么复制构造函数不应该修饰为explicit了,这是由于按照使用习惯,复制构造函数可以采用复制初始化形式执行(语句6)。