转自:http://www.cnblogs.com/destino74/p/3960802.html

  

  条款5:Know what functions C++ silently writes and calls

  

译:了解C++默默编写并调用哪些函数

在C++中,写一个空类,编译器会自动为它声明一个copy构造函数、一个copy assignment操作符和一个析构函数。如果没有声明任何构造函数,编译器也会自动声明一个default构造函数。

如下:

class Empty{};

这就相当于

class Empty{
public:
    Empty(){...}
    Empty(const Empty& rhs){...}
    ~Empty(){...}
    Empty& operator=(const Empty& rhs){...}
}

关于构造函数、copy构造函数的东西前两篇已经有介绍了。

条款6:Explicitly disallow the use of compiler-generated functions you do not want

译:若不想使用编译器自动生成的函数,就该明确拒绝

在一些场合,如果你不想对象内的某个函数被调用,可以把这些函数声明成private隐藏起来,这也是Java中实现工厂模式禁止new一个对象的伎俩。

但其实这并不保险,这些函数依然可以在成员函数或friend函数中被调用,当然,你可以人为的明令禁止调用这些函数。

书中提到的解决方法是只声明不定义。这就是我常犯的错误,声明了函数却没有定义函数体,在编译时会给出一个”无法解析的外部符号”这样的错误。

而利用这一点,就可以达到屏蔽自动生成的函数这一目的。

另一个方法就是实现一个类似Uncopyable接口的类,把需要隐藏的函数声明为私有函数,然后在派生类中私有继承这个Uncopyable类。

将成员函数声明为private且不实现,可禁止编译自动提供的函数。使用像Uncopyalbe这样的基类也能达到相同的目的。

条款7:Declare destructors virtual in polymorphic base classes

译:为多态基类声明virtual析构函数

为什么要为多态基类声明virtual析构函数(虚析构函数)呢?原因是当一个指向派生类的基类指针被销毁时,会调用基类的析构函数,而这时派生类 的析构函数未能执行,派生类对象的成员变量 很可能没被销毁,这就为资源泄漏和莫名其妙的BUG提供温床,相应地增加你在调试上花的时间。

所以,在所有含virtual函数(虚函数)的类中,都应该声明virtual析构函数,这使它在不同的派生类中有不同的表现,从而让派生类中的资源在销毁时能被正确释放。

值得一提的是,当类中不含虚函数时,这往往意味着该类并不是设计来被继承,就不该声明虚析构函数,因为这从未声明一样。

书中提到了不应该继承任何不带virtual析构函数的类(如所有STL容器),在学习STL查阅资料时就了解到, 继承STL的作法给会造成各种糟糕的后果,因此自己在使用的时候总是以组合代替继承,就没有遇到过书中提到的、以及网上大量因继承STL而造成的问题。

带多态性质的基类应该声明一个virtual析构函数。任何带有virtual函数的类都应该拥有一个virtual析构函数。

如果一个类不希望作为基类被继承或不是为了具备多态性而设计,就不该声明virtual析构函数。(不应该设计STL容器派生类)

《Effective C++》笔记:III(转载)的更多相关文章

  1. Item 5:那些被C++默默地声明和调用的函数 Effective C++笔记

    Item 5: Know what functions C++ silently writes and calls 在C++中,编译器会自己主动生成一些你没有显式定义的函数,它们包含:构造函数.析构函 ...

  2. Effective Java笔记一 创建和销毁对象

    Effective Java笔记一 创建和销毁对象 第1条 考虑用静态工厂方法代替构造器 第2条 遇到多个构造器参数时要考虑用构建器 第3条 用私有构造器或者枚举类型强化Singleton属性 第4条 ...

  3. [Effective JavaScript 笔记] 第4条:原始类型优于封闭对象

    js有5种原始值类型:布尔值.数字.字符串.null和undefined. 用typeof检测一下: typeof true; //"boolean" typeof 2; //&q ...

  4. [Effective JavaScript 笔记] 第5条:避免对混合类型使用==运算符

    “1.0e0”=={valueOf:function(){return true;}} 是值是多少? 这两个完全不同的值使用==运算符是相等的.为什么呢?请看<[Effective JavaSc ...

  5. [Effective JavaScript 笔记]第3章:使用函数--个人总结

    前言 这一章把平时会用到,但不会深究的知识点,分开细化地讲解了.里面很多内容在高3等基础内容里,也有很多讲到.但由于本身书籍的篇幅较大,很容易忽视对应的小知识点.这章里的许多小提示都很有帮助,特别是在 ...

  6. [Effective JavaScript 笔记]第27条:使用闭包而不是字符串来封装代码

    函数是一种将代码作为数据结构存储的便利方式,代码之后可以被执行.这使得富有表现力的高阶函数抽象如map和forEach成为可能.它也是js异步I/O方法的核心.与此同时,也可以将代码表示为字符串的形式 ...

  7. [Effective JavaScript 笔记]第28条:不要信赖函数对象的toString方法

    js函数有一个非凡的特性,即将其源代码重现为字符串的能力. (function(x){ return x+1 }).toString();//"function (x){ return x+ ...

  8. java effective 读书笔记

    java effective 读书笔记 []创建和销毁对象 静态工厂方法 就是“封装了底层 暴露出一个访问接口 ” 门面模式 多参数时 用构建器,就是用个内部类 再让内部类提供构造好的对象 枚举 si ...

  9. Effective STL 笔记 -- Item 6 ~ 7: Container and Object Pointer

    Effective STL 笔记 – Item 6 ~ 7: Container and Object Pointer 中间两次笔记被删掉了,简单补一下: Item 3 中提到如果将对象直接放入容器中 ...

  10. effective c++ 笔记 (1-3)

    // //  effective c++.cpp //  笔记 // //  Created by fam on 15/3/23. // // //-------------------------- ...

随机推荐

  1. LeetCode(4)Median of Two Sorted Arrays

    题目 There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the ...

  2. 九度oj 题目1438:最小公倍数

    题目1438:最小公倍数 时间限制:1 秒 内存限制:128 兆 特殊判题:否 提交:2451 解决:2057 题目描述: 给定两个正整数,计算这两个数的最小公倍数. 输入: 输入包含多组测试数据,每 ...

  3. [luoguP2444] [POI2000]病毒(AC自动机 + dfs)

    传送门 先把所有串建一个AC自动机, 如果要找一个不包含任意一个串的串, 说明这个串一直在AC自动机上匹配但匹配不到, 也就是说,匹配时除去val值为1的点,除去fail指针指向val值为1的点,是否 ...

  4. hdu 1251简单字典树

    #include<stdio.h> #include<iostream> #include<string.h> using namespace std; struc ...

  5. 使用XML定义组件样式

    <TextView android:layout_width="match_parent" android:layout_height="wrap_content& ...

  6. winform总结6=>线程和委托的关系

    基础类: using System; using System.Collections.Generic; using System.Linq; using System.Text; using Sys ...

  7. 解析excel文件并将数据导入到数据库中

    今天领导给安排了一个临时工作,让我将一个excel里面的数据解析后放入数据库中,经过一个下午的努力成功完成,现在将代码献上,希望对大家有所帮助 一.需要导入的jar 1.commons-collect ...

  8. mysql建表语句key的含义

    CREATE TABLE `admin_role` (  `adminSet_id` varchar(32) NOT NULL,  `roleSet_id` varchar(32) NOT NULL, ...

  9. 贪吃蛇 c++ ncurses

    近期学ncurses.用贪吃蛇训练下 思路:不构造链表.蛇头向前进方向打点,蛇尾逐点消失,形成移动. 须要记录蛇头方向,蛇尾方向.并用list仿造队列,增加拐点信息(空间比链表每一个结点开辟空间节省非 ...

  10. jqury-validate表单验证

    首先需要引入插件:jquery.validate.js这个插件. 然后对需要验证的表单实现js: $("#add-firewalls-form").validate({ submi ...