Effective C++ 条款5、6、7
条款5 了解C++默默编写并调用哪些函数
1、默认构造函数 Empty();
2、拷贝构造函数 Empty(const Empty& rhs){...}
3、拷贝赋值操作符 Empty& operator=(const Empty& rhs){} (但凡赋值(或赋值复合)操作符都是返回reference to *this,见条款10)
4、析构函数 ~Empty(){...}
5、针对移动构造函数Empty(Empty&& rhs){...},只要自定义了析构函数,编译器就不会自动合成移动构造函数(因为对于基本类型来说是"复制"而非真正的移动,只要其一析构了,另外一个的资源也就没了.所以只要定义了析构函数,就不会合成移动构造~)。
6、针对移动赋值操作符Empty& operator=(Empty&& rhs),理由同上。
条款6 若不想使用编译器自动生成的函数,就该明确拒绝
拒绝的方式有如下两种:
1、只需要将copy构造函数或copy赋值操作符在private中声明即可——从而编译器会方动拒绝调用它们(因为default构造、copy构造和copy赋值函数是编译器自动生成的函数)
2、当然,在C11标准中,可以使用如Empty(const Empty& rhs)=delete;方式,明确拒绝调用此copy构造函数。
3、选择私有继承像Uncopyable这样的base class是一种非常精彩的运用。
class Uncopyable {
protected:
Uncopyable(){}
~Uncopyable(){}
private:
Uncopyable(const Uncopyable&);
Uncopyable& operator=(const Uncopyable);
};
//用法如下
class HomeForSale:private Uncopyable{};//class不再用声时copy构造函数或copy assginment操作符
条款7 为多态基类声明virtual析构函数
1、C++明确指出,当derived class对象经由一个base class指针被删除,而该bass class带着一个non-virtual析造函数,其结果未有定义(也就是说实际执行时通常发生的是对象的derived成分没有被销毁)。
解决办法很简单:给bass class一个virtual析构函数。
2、class不含virtual函数,通常表示它并不意图被用做一个base class。当class不企图被当作base class令其析构函数为virtual往往是一个馊主意(书上虽讲解的很明白,但还是似懂非懂,所以还是默认此准则,“馊主意”)。
说直接一点就是,析构函数需要virtual关键字时,才添加,否则不要画蛇添足。
使用心得:当class内含至少一个virtual函数时,才为析构函数声明为virtual函数。
3、继承一个类,但此类的析构函数没有virtual关键字修饰,同样是件灾难事情(见下面灾难代码)。所以STL库中的类,绝不用来派生其他类。
class SpecialString :public string {};//绝对是一个馊主意,因为string有个non-virtual析构函数
SpecialString* pss = new SpecialString("Impending Doom");
string* ps;
...
ps = pss;//SpecialString* => string*
...
delete ps;//未有定义!现实中*ps的SpecialString资源会泄漏,因为SpecialString析构函数没被调用
以下内容均来自Scott Meyers大师所著Effective C++ version3,如有错误地方,欢迎指正!相互学习,促进!! 上一篇: MySQL必知必会
下一篇: Effective C++ 条款总结
推荐阅读
-
js正则表达式之$1$2$3$4$5$6$7$8$9属性,返回子匹配的结果
-
Effective C++ 笔记:条款 31 将编译关系降至最低
-
IIS导入服务器证书的方法(IIS5、IIS6、IIS7)
-
9月6日首发!麒麟990大曝光:7nm+全新架构、内置5G基带
-
Intel十代酷睿i7-10750H、i5-10300H现身:6核心加速5GHz
-
华为nova6 5G版登场:麒麟990+巴龙5000双7nm芯片加持、颜值与性能齐飞
-
4>5+6+7 黑鲨4预热:一骑绝尘
-
Effective Modern C++ 条款32 对于lambda,使用初始化捕获来把对象移动到闭包
-
Effective Modern C++ 条款23 理解std::move和std::forward
-
一图看懂三星14/10/11/8/7/6/5/4/3nm工艺 花样真多