zoukankan      html  css  js  c++  java
  • Effective C++ 学习之尽量以const inline enum 代替#define

          记得在大学暑假的时候看过一遍<Effective C++>,由于当时对整个C++的认识比较的肤浅,很难能真正能体会到Effective中的每一点的含义,好像当时就像读小说一样给读过去了。最近重新开始了这本书的实践性学习,在这里记载一些重新读这本书的收获和一些新的认识。其中可能由于自己的认识不够深入,有错误理解的地方,还希望园中各位朋友多多指正。

        其中的第一条就不在这里细写了,其中的关键就是分清楚C++是由那几部分组成的,并且明确你正在使用的是那一部分以及各个部分之间有什么联系。

    自己的目标是以后每周能够好好的细读其中的3-4个主题,而且将每一条的学习进行详细的整理。

    现在就从第二条开始吧!

    其中的注意点有一下两个:

    1.当我们定义一个常量指针的时候,尤其是指向一个char*-based字符串的时候,你必须写两次的const也就是:

    const char* const AuthorName = "Scott Meyers“

    前面的那个const对经常写C代码的人来说就有点多余了,因为按照C里的逻辑AuthorName指向的是一个字符串常量,而在C中字符串常量是存放在代码段(GCC编译结果)的,由于代码段是只读的所以前面的那个const就可以完全不写。这点在C++中就有点不一样了如果你丢失了前面的const编译器会给你相应的警告。这一点也就说明了C++相对与C来说是一门强类型语言。也真如Effective中所说我们在程序中能有STL的时候尽量的使用STL吧。

     2.这一点是在讲到class专属常量的时候提到,其中代码如下:

    class GamePlayer {
      static const int NumTurns = 5; //常量声明式
      int score[NumTurns];              //常量使用式
    };

    在该段代码的下面有这样的一句话:“你看到的NumTurns为声明式而非定义式,你在实现文件中需要给出一个他的定义”。当第一看到这句话的是确实有点不好理解,仔细推敲一下就会发现其中的道理。在类中的成员变量前面加上static说明他是属于GamePlayer类而不是属于某个实例化的成员,也就说明不可能存放在函数的栈上,那么他就可能是存放在全局静态区/堆/代码区中的某一个。只有在new出一个对象的时候才会将其存储到堆空间,所以也就排除了其存放在堆空间的可能。那么就剩余两种可能了

       1.存放在全局栈区

     2.存放在代码区

    其实这两的地方都有可能存放一个变量,如果将一个变量只定义为static而非const就会将其存储在全局栈区。如果有const限定词,则会将其存储在代码区。

    在本例中如果在.cpp文件中没有对NumTurns进行定义,就会出现连接器无法在当前的程序空间中无法查找到NumTurns存放地址的情况。

    PS:以上是对<Effective C++>中第二条的学习心得,希望各位园友指正。

  • 相关阅读:
    32位与64位操作系统到底有什么区别呢?
    chr()、unichr()和ord()
    Python map filter reduce
    as3.0横向渐变发光字
    Python time format
    Python 使用sys重定向
    as3.0给文字加纹理效果
    my first python
    字符编码(转)
    SWFTOOLS学习笔记一(转)
  • 原文地址:https://www.cnblogs.com/lzh2nix/p/2991979.html
Copyright © 2011-2022 走看看