C++让人诟病的一个原因是编译器默默为我们做了很多事情而我们却不了解,本篇博客就【Effective C++】和【深度探究c++模型】内容,简单讨论下编译器默默做的事情。
在类中如果你没有定义default constructor,copy constructor,copy assignment operator,编译器会为我们合成它们。其实这几句话我们需要重新理解:根据C++标准“我们只有在需要的时候,才会定义这些函数”,而“需要”是指编译器需要,而非程序员需要。何时才是编译器需要呢?对于构造函数来说,只有四种情况下才会合成一个默认的构造函数,具体参见【深度探究c++模型】第二章,此处不做具体讨论。
下面是本条款需要注意的几个知识点:
1、若类中声明了一个构造函数,编译器就不会再为其创建一个构造函数。
原因:若果你自己用心设计了一个class,其构造函数是有参数的,你就无须担心编译器会毫无挂虑的为你添加一个无参构造函数而遮盖你的版本。
需要记住C++标准中“不允许让reference 改只想不同的对象”,此处的对象即指class对象,又指数据变量。同时,也不允许对const变量进行赋值。对于reference和const变量只能初始化,不能进行赋值操作,所以:
2、如果你打算 在一个“内含reference成员的”class内支持copy assignment operator
你就必须自己定义copy assignment operator,而不能依靠合成的default copy assignment operator。同理对const成员也是如此。
3、如果某个base class将copy assignment operator声明为private,编译器拒绝为其derived classes生成一个copy assignment operator
原因很简单,对于继承体系下对象的构造总是从基类到派生类逐级构造,此时派生类的构造函数无权调用基类的构造函数。