c++条款

num 1:尽量以const enum inline替换#define

   1)对于单纯常量,最好以const对象或enums替换#defines

   2)对于形似函数的宏,最好改用inline函数替换#define

num 2:尽可能使用const

   1)将某些东西声明为const可帮助编译器侦测出错误用法

   2)当const  non-const 成员函数有着实质等价的实现时,令nono-const调用const版本可避免重复。

    eg:

      class TextBlock {

      public:

        const char& operator[](std::size_t position) const {

          return text[position];

        }

        char& operator[](std::size_t position) {

          return   const_cast<char&>(static_cast<const TextBlock&>(*this)[position]);

          //从原始TextBlock转换为const TextBlock,调用const operator[],将const char& 转换为char&.

        }

      };

num 3:确定对象被使用前已被初始化

   1)对内置型对象进行手工初始化,因为c++不保证初始化它们

   2)构造函数最好使用成员初始化列表,其排列次序和它们在class中的声明次序相同

   3)以local static对象替换non local static对象

    当某编译单元内的non-local static对象的初始化动作使用另一个编译单元内的某个nono-local static对象,但所用对象可能尚未初始化。----将non-local static对象搬到自己的专属函数内,这些函数返回一个reference指向它所含的对象。然后用户调用这些函数。保证对象已被初始化

二:构造/析构/赋值运算

num 1:编译器可暗自创建4个成员函数

    当class内含reference成员或const成员,必须自己定义赋值操作符

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

    1)所有编译器产出的函数都是public:可将不想使用的函数放入private且只声明不实现

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

    1)当基类的析构函数为非virtual,是错误做法。如string作为基类

    2)希望class成为抽象的class为其声明pure virtual 析构函数。virtual ~AWOV() = 0;

    3)带多态性质的基类应声明一个virtual析构函数。若class带有任何virtual函数,它就应该拥有一个virtual析构函数

    4)class的设计目的若不是作为基类使用或不是为了具备多态性质,就不应该声明virtual析构函数

num 4:别让异常逃离析构函数

    1)析构函数绝对不要吐出异常。析构函数应该捕捉任何异常并吞下它们或结束异常

    2)若客户需要对某个操作函数运行期间抛出的异常做出反应,那class应该提供一个普通函数执行该操作

num 5:绝不在构造析构中调用virtual函数

num 6:令operator=返回一个reference to *this

num 7:在operator=中处理自我赋值

    eg:Widget&  Widget::operator=(const Widget& rhs)

      {  if(*this == rhs) return *this;    delete pb;  pb = new Bitmap(*rhs.pb); return *this; 

        //2:Bitmap* pOrig = pb; pb = new Bitmap(*rhs.pb); delete pOrig; return *this;

       }

num 8:复制对象时勿忘其每一个成分

   1)确保复制“对象内的所有成员变量及所有基类成分    

   2)不要常识以某个copy函数实现另一个copy函数。应该将共同机能放进第三个函数,并有两个copy函数共同调用

三:资源管理

num 1:以对象管理资源

   1)在构造函数中获得资源,在析构函数中释放资源

   2)使用shared_ptr  auto_ptr管理资源。最好使用shared_ptr---计数指针,当引用计数为0时释放对象。当shared_ptr  auto_ptr其析构函数调用delete,因此不能与数组相关

num 2:在资源管理类中小心coping行为???

num 3:在资源管理类中提供对原始资源的访问???

num 4:成对使用new delete时要采取相同形式

num 5:以独立语句将newed对象置入智能指针

    eg:shared_ptr<Widget> pw(new Widget);

      processWidget(pw,priority());

四:设计与声明

num 1:让接口容易被使用,不易被误用

num 2:设计class犹如设计type

   1)新type的对象应该如何被创建和销毁?

   2)对象的初始化和对象的赋值该有什么样的差别?

   3)新typw的对象如果被passed by value,意味着什么?copy 构造函数用来定义一个type的passed by value

   4)什么是新type的合法值?

   5)你的新type需要配合某个继承图系吗?

   6)你的新type需要什么样的转换?

   7)什么样的操作符和函数对此新type而言是合理的?

   8)什么样的标准函数应该驳回?那些必须声明为private

   9)什么是新type的未声明接口?

   10)谁该取用新的type成员?

   11)是否真的需要一个新type?

num 3:以引用传递代替值传递

   1)引用传递更高效

   2)该规则并不适合内置类型以及STL的迭代器和函数对象。值传递更适合

num 4:必须返回对象时,别妄想返回其reference??

num 5:将成员变量声明为private

   1)protected并不比public更具封装性

num 6:宁以non-member non-friend 替换member函数

num 7:若所有参数皆需类型转换,请为此采用non-member 函数

    如算数混合运算,可以使用非成员函数或友元函数进行类型转换

num 8:考虑写出一个不抛异常的swap函数

   1)以指针指向一个对象,内含真正数据。当要置换两个对象值,唯一需要做的就是置换其指针---具体实践是将std::swap针对对象特化。

    eg:class Widget {

      public:  void swap(Widget& other)  { using std:swap;  swap(pImpl,other.pImpl); }

      };

    namespace  std {

     template<>

     void swap<Widget>(Widget& a,Widget& b)  { a.swap(b);   }

    }

   2)偏特化只对类模板有用

   3)当std:swap对类型效率不高时,提供一个swap成员函数

   4)当提供一个member swap,也提供一个非member swap来调用

  

五:实现

num 1:尽可能延迟变量定义式的出现时间

num 2:尽量少做转型

num 3:避免返回handles(指针、引用、迭代器)指向对象内部成分

num 4:为异常安全而努力是值得的

num 5:透彻了解inlining

num 6:将文件间的编译依存关系降至最低

   1)相依于声明式,不要相依于定义式

六:继承与面向对象设计

num 1:确定public继承是is_a关系

num 2:避免遮掩继承而来的名称

num 3:区分接口继承和实现继承

   1)public继承下,子类总是继承父类接口

   2)pure  virtual函数只具体指定接口继承

   3)非纯虚函数具体指定接口继承及缺省实现继承

   4)非虚函数指定接口继承和强制实现继承

num 4:考虑virtual函数以外的其他选择

num 5:绝不重新定义继承而来的non-virtual函数

num 6:绝不重新定义继承而来的缺省参数值(默认参数值)

num 7:明智而审慎使用private继承

七:模板与泛型编程

num 1:了解隐式接口与编译期多态

   1)class与template都支持接口和多态

   2)对class而言接口是显式,以函数签名为中心,多态通过虚函数发生与运行期

   3)对template而言,接口是隐式,有效表达式展现。多态通过具现化与函数重载解析发生于编译期

num 2:了解typename双重意义

   1)使用template标识嵌套从属类型名称,但不能在基类列表或成员初始化列表内以他作为基类修饰符

num 3:学会处理模板化基类内的名称??

num 4:将与参数无关的代码抽离template

   1)template生成多个class和函数,任何template代码都不该与某个参数产生相依关系

   

    

         

effictive c++的更多相关文章

  1. [effictive c++] 条款04 确定对象被使用前已被初始化

    成员初始化 在c和c++ 中,使用为初始化的类型经常会引发不可预料的错误,从而使得我们要花费巨大的时间用于调试查找问题,所以确定对象被使用前已被初始化是个非常好的习惯. 永远在使用之前对对象进行初始化 ...

  2. Effictive C++ 学习记录

    这是前段时间看的书,整理到这里吧,以后查看也方便. 这些条款需要反复查看. 条款01:视C++为一个语言联邦 条款02:尽量用const.enum.inline替换#define 条款03:尽可能的使 ...

  3. 在对象内部尽量直接訪问实例变量 --Effictive Objective-C 抄书

    在对象之外訪问实例变量时,应该总是通过属性来做.在那么在对象内部訪问实例变量的时候,又该怎样呢? 这是 OCer们一直激烈讨论的问题.有人觉得,不管什么情况,都应该通过属性来訪问实例变量;也有人说,& ...

  4. Effictive Java学习笔记1:创建和销毁对象

    建议1:考虑用静态工厂方法代替构造器 理由:1)静态方法有名字啊,更容易懂和理解.构造方法重载容易让人混淆,并不是好主意 2)静态工厂方法可以不必每次调用时都创建一个新对象,而公共构造函数每次调用都会 ...

  5. BAT的面试经验_摘抄

    一.心态 心态很重要! 心态很重要! 心态很重要! 重要的事情说三遍,这一点我觉得是必须放到前面来讲. 找工作之前,有一点你必须清楚,就是找工作是一件看缘分的事情,不是你很牛逼,你就一定能进你想进的公 ...

  6. 和Java相关的一些好文章(不定期更新)

    1.Java 集合类详解 (包括arraylist,linkedlist,vector,stack,hashmap,hashtable,treemap,collection等). 2.Java 理论与 ...

  7. Android复习指南

    基础无外乎几部分:语言(C/C++或java),操作系统,TCP/IP,数据结构与算法,再加上你所熟悉的领域.这里面其实有很多东西,各大面试宝典都有列举. 在这只列举了Android客户端所需要的和我 ...

  8. 高效的使用STL

    高效的使用STL 仅仅是个选择的问题,都是STL,可能写出来的效率相差几倍: 熟悉以下条款,高效的使用STL: 当对象很大时,建立指针的容器而不是对象的容器 1)STL基于拷贝的方式的来工作,任何需要 ...

  9. 基础1 JavaSe基础

    JavaSe基础 1. 九种基本数据类型的大小,以及他们的封装类 boolean 无明确指定 Boolean char 16bits Character byte 8bits Byte short 1 ...

随机推荐

  1. Dubbo对Spring Cloud说:来老弟,我要拥抱你

    项目地址 https://github.com/yinjihuan/kitty-cloud 前言 Kitty Cloud 开源后有以为朋友在 GitHub 上给我提了一个 issues,问为什么项目中 ...

  2. 谈谈Java常用类库中的设计模式 - Part Ⅰ

    背景 最近一口气看完了Joshua Bloch大神的Effective Java(下文简称EJ).书中以tips的形式罗列了Java开发中的最佳实践,每个tip都将其意图和要点压缩在了标题里,这种做法 ...

  3. Java并发编程:线程池ThreadPoolExecutor

    多线程的程序的确能发挥多核处理器的性能.虽然与进程相比,线程轻量化了很多,但是其创建和关闭同样需要花费时间.而且线程多了以后,也会抢占内存资源.如果不对线程加以管理的话,是一个非常大的隐患.而线程池的 ...

  4. 【Python Deap库】遗传算法/遗传编程 进化算法基于python DEAP库深度解析讲解

    目录 前言 概述 启发式的理解(重点) 优化问题的定义 个体编码 初始族群的创建 评价 配种选择 锦标赛 轮盘赌选择 随机普遍抽样选择 变异 单点交叉 两点交叉 均匀交叉 部分匹配交叉 突变 高斯突变 ...

  5. 中国空气质量在线监测分析平台之JS加密、JS混淆处理

    中国空气质量在线监测分析平台数据爬取分析 页面分析:确定url.请求方式.请求参数.响应数据 1.访问网站首页:https://www.aqistudy.cn/html/city_detail.htm ...

  6. SpringBoot之整合MongoDB

    MongoDB官网安装:https://www.mongodb.com/download-center/community MongoDB客户端工具(Mongo Management Studio)安 ...

  7. JavaScript高级技术总结

    正则表达式 正则表达式的作用  正则表达式的作用: 匹配字符串的一种规则,正则表达式的作用主要是用于匹配字符串的 需求: 校验手机号 <!DOCTYPE html> <html la ...

  8. 王艳 201771010127《面向对象程序设计(java)》第六周学习总结

    实验六 继承定义与使用 一:理论部分: 第五章:继承类. 1.继承:已有类来构建新类的一种机制.档定义了一个新类继承另一个类时,这个新类就继承了这个类的方法和域,同时在新类中添加新的方法和域以适应新的 ...

  9. python 读取txt文件

    1.打开文件 #1)1 f = open("test.txt","r") #设置文件对象 f.close() #关闭文件 #2) #为了方便,避免忘记close ...

  10. Kafka SSL安装与配置

    1.概述 最近有同学咨询说,Kafka的SSL安全认证如何安装与使用?今天笔者将通过以下几个方面来介绍Kafka的SSL: Kafka 权限介绍 Kafka SSL的安装与使用 Kafka Eagle ...