条款 01:c++是一个语言联邦而不是一种单一的语言,

  它包括:

    1、C语言:没有模版、没有异常、没有重载……

    2、Object-Oriented C++:class、析构函数、构造函数、封装、继承、多态、虚函数、动态绑定……

    3、Template c++:唯template适用

    4、STL:容器、迭代器、算法以及函数对象

  总结:而我现在会了一点点C语言,懂了点面向对象,刚看Template c++和STL,得继续努力!

条款 02:尽量以const、enum、inline替换#define

  总结:#define只是简单的替换,在写程序的过程中,由于简单的替换会产生许多意想不到的错误,例如:

      #define CALL_WITH_MAX(a,b) f((a) > (b) ? (a) : (b))

      int a = 5,b = 0;

      CALL_WITH(++a,b);  //a被累加两次

      CALL_WITH(++a,b + 10);//a被累加一次

     而用const则完全不会出现以上错误,在C++中const完全替换#define

条款 03:尽可能使用const

  总结:这里有两点需要注意

     1、指针常量和常量指针的判断

       在这之前常常分不清到底是指针本身是常量还是指针指向的内容为常量,这里有一个判断的好方法:

         如果关键字const出现在信号左边,表示被指物是常量;如果出现在星号右边,表示指针自身是常量;如果出现在星号的两边,表示被指物和指针两者都是常量。

       char greeting[] = "Hello";

       char*p = greeting;         //都不是常量

         char * const p = greeting;     //指针本身是常量,指向内容非常量

         const char * p = greeting;     //指针本身非常量,指向内容是常量

       const char * const p = greeting;   //指针和指向内容都是常量

      2、const成员函数

         a、两个成员函数如果只是常量性不同,可以被重载,这是C++的一个重要特性;

         class TextBlock {

         public :

           const char & operator[] (std::size_t position) const {return test[position];}  //operator[] for const对象

           char & operator[] (std::size_t position) {return test[position];}         //operator[] for non-const对象

        private:

          std::string text;

        };

        TextBlock tb("Hello");     std::cout << tb[0];  //调用non-const TextBlock::operator[]

        const TextBlock ctb("Hello");     std::cout << ctb[0];  //调用const TextBlock::operator[]

        const对象调用const函数,non-const对象调用non-const函数,这是很合理的安排,一个const对象里的成员变量肯定不能被改变,所以调用const函数(他们不会改变成员变量)。如果const函数返回的是对象的成员变量的引用时,const成员函数的返回值也要用const修饰,否则该函数还是有可能对成员变量进行赋值:

        例如上面的const char & operator[] (std::size_t position) const {return test[position];}去掉前面的const,那么ctb[0] = 'x'这样的赋值操作是可以通过编译的,但是实际上它是不合理的(ctb是const对象呀).

          但是,还有一种情况,如果const对象调用const函数想改变对象的成员函数那该怎么办?很简单,将该要被改变的成员变量修饰为:mutable!

      b、在const 和 non-const成员中避免重复

        如果为了供const和非non-const分别调用而设置const和no-const成员函数,使得他们代码一模一样,只是那该怎么办?

        为了避免代码重复,您可以这样做:

        class TextBlock {

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

           {

              ...        //这里有很多代码。

              return text[postion];

           }

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

            {

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

              //如果不熟悉C++的强制转换,请参考http://www.cnblogs.com/alexqdh/archive/2011/06/09/2075713.html

           }

        };

条款 04 确定对象使用前已经被初始化

  总结:在了解这个条款之前,希望大家已经区别了初始化和第一次赋值的区别,咱们举个例子看看

     class A {

     public:

        A(int a,int b,intc):ma(a),mb(b),mc(c)  //是初始化(列表)

        {}                   //空操作

        A(int a,int b)

        {

          ma1 = a ;             //这不是初始化

          mb1 = b;             //这是赋值

        }

     private:

       int ma,mb,mc;

       int ma1,mb1;

     };

    就是因为有了初始化和第一次赋值的区别,所以类中要同时定义 copy构造函数和 =运算符重载!

         

Effective c++ 第一章 让自己习惯C++的更多相关文章

  1. Effective java第一章引言

    菜鸟一枚,开始读第一本书<Effective Java>(第二版)~ 看引言就有好多名词不懂(>_<) 导出的API由所有可在定义该API的包之外访问的API元素组成.一个包的 ...

  2. 【C++】《Effective C++》第一章

    第一章 让自己习惯C++ C++是一个威力强大的语言,带着众多特性,但是在你可以驾驭其威力并有效运用其特性之前,你必须先习惯C++的办事方式. 条款01:视C++为一个语言联邦 如今的C++已经是个多 ...

  3. 《Effective C++》第1章 让自己习惯C++-读书笔记

    章节回顾: <Effective C++>第1章 让自己习惯C++-读书笔记 <Effective C++>第2章 构造/析构/赋值运算(1)-读书笔记 <Effecti ...

  4. Effective JavaScript :第一章

    第一章 一.严格模式与非严格模式 1.在程序中启用严格模式的方式是在程序的最开始增加一个特定的字符串字面量: ‘use strict’ 同样可以在函数体的开始处加入这句指令以启用该函数的严格模式. f ...

  5. Stealth视频教程学习笔记(第一章)

    Stealth视频教程学习笔记(第一章) 本文是对Unity官方视频教程Stealth的学习笔记.在此之前,本人整理了Stealth视频的英文字幕,并放到了优酷上.本文将分别对各个视频进行学习总结,提 ...

  6. 【USACO】第一章总结

    做了大半个月,终于把第一章做完了 有的题遇到了不小的坎儿,看着网上一群高中生都做得那么好,心理还是有些小郁闷的.不禁感慨我过去的四年真是虚度啊.总结一下第一章学习到的知识吧. ①闰年判断 int is ...

  7. JAVA学习之Ecplise IDE 使用技巧(1)第一章:我的地盘我做主,工作空间

    麦子学院/Andriod应用开发/第一阶段 Android 学前准备 第三课:Eclipse IDE 使用技巧 由马一鸣老师讲解.感谢麦子学院免费开放这部分视频资源. Eclipse由IBM开发的,2 ...

  8. Laxcus大数据管理系统2.0(2)- 第一章 基础概述 1.1 基于现状的一些思考

    第一章 基础概述 1.1 基于现状的一些思考 在过去十几年里,随着互联网产业的普及和高速发展,各种格式的互联网数据也呈现爆炸性增长之势.与此同时,在数据应用的另一个重要领域:商业和科学计算,在各种新兴 ...

  9. 翻译学python---《Learn Python the hard Way》---第一章 绪论

    打算学习python,但是又不想单纯地看书或是写个小项目,干脆引入很流行的翻译学习法来学习吧-         在论坛上看到了国外的一本<Learn Python the hard Way> ...

随机推荐

  1. C# WinForm获取程序所在路径方法

    多个获取WinForm程序所在文件夹路径的方法,收藏备忘. 1)获取当前进程的完整路径,包含文件名(进程名). 代码:string str =this.GetType().Assembly.Locat ...

  2. HttpContext.Current

    HttpContext. Response 直接这样写会报错 是因为 httpcontext没有提供response 这个静态的方法. 通过这样写就可以 ASP.NET还为它提供了一个静态属性Http ...

  3. sp_addlinkedserver的一些操作

    sp_addlinkedserver 创建一个链接的服务器,使其允许对分布式的.针对 OLE DB 数据源的异类查询进行访问.在使用 sp_addlinkedserver 创建链接的服务器之后,此服务 ...

  4. NgNice项目案例

    技术构架: 服务端技术:NodeJS + Express4.x + Mongodb + Mongoose 前端技术: AngularJS1.2.x + Bootstrap3.x 源码:https:// ...

  5. [转]一个备份MySQL数据库的简单Shell脚本

    本文翻译自 iSystemAdmin 的 <A Simple Shell Script to Backup MySQL Database> Shell脚本是我们写不同类型命令的一种脚本,这 ...

  6. Jquery 点击空白处消失

    $(document).bind("click", function (e){ if ( $((e.target || e.srcElement)).closest("# ...

  7. (java)从零开始之--观察者设计模式Observer

    观察者设计模式:时当一个对象发生指定的动作时,要通过另外的对象做出相应的处理. 步骤: 1. A对象发生指定的动作是,要通知B,C,D...对象做出相应的处理,这时候应该把B,C,D...对象针对A对 ...

  8. TCP/UDP基本概念部分

    最近在读<Unix网络编程>和<TCP/IP详解>两本书,有了一些自己的心得与体会,总结下其中典型的问题. 1. 为什么建立连接需要三次握手? 谢希仁的<计算机网络> ...

  9. 【POJ1195】【二维树状数组】Mobile phones

    Description Suppose that the fourth generation mobile phone base stations in the Tampere area operat ...

  10. 计算机天才Aaron Swartz 名作 《如何提高效率》——纪念真正的“hacker"!

    如何提高效率 <HOWTO: Be more productive>(如何提高效率)作者:Aaron Swartz 肯定有人跟你说过这样的话,“你有看电视的那么长时间,都可以用来写一本书了 ...