在本系列阅读笔记中,我尝试根据自己的理解对文中提到的条款进行解释,而对一些通识性的知识只是单纯的做一个笔记,笔者自身是一个c++的新手菜鸟,理解不可避免地存在纰漏和错误,希望在讨论中得到更充足的进步。
本书的导读部分介绍了c++的一些术语,如“声明式”、“定义式”,“接口”和“客户”。考虑下述代码:
class Widget
{
public:
explicit Widget(int value_):value(value_){};
Widget(const Widget& rhs){};
Widget& operator=(const Widget& rhs){};
private:
int value;
};
int main()
{
Widget w1 = 1; //(1)式
Widget w2(1); //(2)式
Widget w3(w2); //(3)式
w3 = w2; //(4)式
Widget w4 = w2; //(5)式
}
在上面这段代码中出现了显示构造函数,拷贝构造函数和赋值操作符三个概念,其中显示构造函数通过关键词explicit修饰,声明为explicit的构造函数通常比non-explicit更受欢迎,因为它们禁止编译器执行非预期的类型转换,这也是我们通常所希望的,如(1)式所示,这是一个隐式类型转换,在本段代码中该处会出现编译失败的错误。
对于拷贝构造函数和赋值操作符,我们需要注意的是"="语法也可以用来调用拷贝构造函数,区分它们的关键在于是否有新对象被定义,如(5)式,有新对象w4被定义,所以它将调用拷贝构造函数,与之相反的,(4)式只会执行赋值操作符。