重读The C++ Programming Language(一)

来源:互联网 发布:java重载的作用 编辑:程序博客网 时间:2024/05/21 05:21

 

这些天比较清闲,于是开始重读The C++ Programming Language,发现收获丝毫不比第一次读的时候少,每每有——哇,原来这里有这么清楚地解释——于是列出来,备随时翻翻。

 

//================================================================

 

1,文字量就是一个常量。

2, 字符文字量就是一个值。

3,字符串文字量存在静态区域的常量。两个相同的字符串文字量可能在存储于相同地址(这跟实现有关)。

4, 整数文字量就是一个值,0x1,02,3L,4U。

5, 枚举enum是一种类型,所以不存在存储域的问题,尤其是在类里常常用enum代替常量定义,这种常量仅仅是符号常量,不会占用任何存储。

6,声明中后缀总是拥有更强的约束里,比如 *kings[]表明最终他是个数组。

7,全局的静态的对象总是被默认初始化为0,但是对于栈上分配的对象却没有这样的默认处理。

8,左值的本质含义是表示一块内存。

9,NULL在C中常用,而在c++中尽量用0。

10,引用必须要有初始化,且之后不能改变。

11, 如果用到类型转换的话,请使用T t = T(i);的方式,而不是T t = (T)i;的方式,后一种是C风格的。但是如果说T是指针,那么这将出现问题。

12,类型转换有static_cast,reinterpret_cast,const_cast,dynamic_cast,等操作符。

13,if( bool  b = 1){b;}else{b;},这个bool的b在else的域中同样是有效地。

14,inline不是函数的类型,所以不需要在cpp中出现,而且inline函数不允许被extern申明,即它是内部连接的。

15,同样函数的默认参数也不是函数的类型,所用也不要出现在cpp中。

16,函数的重载不允许仅仅发生在返回值上。

17,const定义的全局变量是内部连接的,即在两个不同的.c文件可以定义相同名字的不同常量值(但这相当的糟糕)。通常都把const常量定义在头文件里。

18,static函数也表示内部连接,但是不要使用。

19, 模版template函数的实现必须放在头文件,在线函数inline也尽量放在头文件里。

20,extern int a这种东西不仅可以而且更应该放在头文件中。所以常量常常是这样的extern const int x;或者干脆const int x = 1;

21, cosnt必须初始化,可以有这样的形式const char c = getchar();

22, C中const常量表示read only,c++保持了这种语义,但是const量在不必要的情况下不会分配存储,而是当做符号常量处理。

23,如果const与指针结合的话会有三种情况,但是char const是不良的表示,而应该使用const char。

24, const在函数参数中表示不可修改,常常与引用一起使用,以消除压栈时间。

25, const作为函数的返回值,这个用处并不是太大。

26, const作为函数的类型,必须是类的成员函数,以便约束数据成员不被这个成员函数修改,同时使得该函数不能调用类的其他非const的成员函数。这里会出现一个逻辑的常量性问题。

27,逻辑的常量性要求成员函数在逻辑上不去修改成员数据,但是可以实际更改类的状态,此时请使用mutable。

28,类可以有const数据成员,表示类的这个成员是个常量,但是这个成员必须要在构造函数列表中初始化,不能在函数体中初始化。

29,类中的常量成员常常用enum来代替,这样的enum是一种类型,并不会占用存储空间。

30,const并不能改变数据的存储区域。即全局的const分配在静态区,局部的const分配在栈中。

31,常量可能并不会有存储空间,而直接被用作符号代换。

32, static修饰全局变量是表明其位于静态区,仅仅为本模块可见,与extern相对应。修饰全局函数同样如此(不建议这样修饰函数,尽管C中大量的这么用)。

33,static修饰局部变量是表明该变量不再在栈上分配,而是跟全局变量一样在静态区分配,但是却不具备全局变量所具备的全局可见性,仅仅是局部可见。

34,static修饰类的成员变量时表明该成员变量为类的所有对象共有,必须要在类域的外面做初始化处理。

35,static修饰类的成员函数时表明该函数仅仅能访问类的static成员,因为他没有this指针。

36,const static如果修饰全局变量,表明为本模块的常量。

37,const static如果修饰类的成员,则成员类型仅仅为int,且必须在类声明时初始化成员。

38,extern表明外部性,某种程度上跟include有相同的功能。

39,再两个没有命名的名字空间中的函数同样可以重载。但是如果名字空间的命名不同则不行。

40,不要include没有必要的文件,这将使编译单元更加混乱,而导致莫名其妙的问题。

 

原创粉丝点击