c++复制构造函数问题
在c++ primer中,关于复制初始化的一些问题总是搞不懂,请大神指点
class Sales_item{
public:
Sales_ietm(const string&);
};
Sales_ietm item=string("9-999-99999-9");书中讲,复制初始化经过2步(1)调用相对于的构造函数生成临时对象(2)将临时对象作为实参通过复制构造函数初始化对象的数据成员。但是当构造函数声明为explicit时,则item不能正确初始化,请问这是为什么?初始化卡在哪一步了?另外又说,当构造函数为显式时,则初始化失败,构造函数不是显式时,初始化成功。请问这又该如何理解?谢谢了~~
[解决办法]
1:构造函数声明为explicit时,则item不能正确初始化,请问这是为什么?初始化卡在哪一步了?
explicit限定了构造函数不能进行类型转换(Sales_item item=string("9-999-99999-9");
由于左右两边类型不匹配,需要类型转换,编译器默认去找Sales_item(const string&)的构造函数),因此在第一个阶段初始化就失败了。
2:构造函数为显式时,则初始化失败,构造函数不是显式时,初始化成功
Sales_item A ;默认要去找空的构造函数的,当显式声明了带参的构造函数那么编译器不会自动生成非空的构造函数,因此初始化失败。
[解决办法]
class Sales_item{ public:
explicit Sales_ietm(const string&); };
Sales_ietm item=string("9-999-99999-9");
这样写需要重载赋值操作符=,让它接受string类型的参数。
explicit 表明是要显示的调用Sales_ietm(const string&); }; 构造对象。
赋值操作符= 是隐式调用拷贝构造函数,这是不行的,因为你的拷贝构造函数写明为explicit
Sales_ietm item=Sale(string("9-999-99999-9"));
//这样应该可以
explicit
C++ Specific
This keyword is a declaration specifier that can only be applied to in-class constructor declarations. Constructors declared explicit will not be considered for implicit conversions.