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++>中第二条的学习心得,希望各位园友指正。

posted on 2013-03-31 18:17  zkqian  阅读(283)  评论(0编辑  收藏  举报