下面是本章自己疑惑或重要的内容:
 
1.char的三种类型
 
书中原话:“和其他整型不同, char 有三种不同的类型: plain charunsigned charsigned char。虽然 char 有三种不同的类型,但只有两种表示方式。可以使用 unsigned char 或 signed char 表示 char 类型。使用哪种 char 表示方式由编译器而定。”,也就是说,char c,c不是 unsigned char 就是 signed char,但这是由编译器决定的。但不管是什么类型,c都大到足以存储字符集中的任何字符。
 
关于这方面的详细内容见http://veniriver.blog.sohu.com/129468080.html
 
2.将超出其范围的值赋给一个指定类型的对象时
 
1)当将超过取值范围的值赋给 un signed 类型时,编译器会将该值对 unsigned 类型的可能取值数目求模。
2)当将超过取值范围的值赋给 signed 类型时,由编译器决定实际赋的值。
 
3.整型和浮点字面值规则
 
1)字面值整数常量的类型默认为 intlong 类型。其精度类型决定于字面值——其值适合 int 就是 int 类型,比 int 大的值就是 long 类型。通过增加后缀,能够强制将字面值整数常量转换为 longunsignedunsigned long 类型。
2)默认的浮点字面值常量为 double 类型。在数值的后面加上 Ff 表示单精度。同样加上 L 或者 l 表示扩展精度。
 
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 

4C++变量初始化
C++ 支持两种初始化变量的形式:复制始化直接初始化。复制初始化语法用等号(=),直接初始化则是把初始化式放在括号中。初始化是指创建变量并给它赋初始值。
13.1 节给出了更详细的解释:直接初始化直接调用与实参匹配的构造函数,复制初始化总是调用复制构造函数。复制初始化首先使用指定构造函数创建一个临时对象,然后用复制构造函数将那个临时对象复制到正在创建的对象。

 

5.声明和定义
原书中第 2..3.5 节中有以下内容:extern double pi = 3.1416; // definition

虽然使用了 extern ,但是这条语句还是定义了 pi,分配并初始化了存储空间。只有当 extern 声明位于函数外部时,才可以含有初始化式。
对于“只有当 extern 声明位于函数外部时,才可以含有初始化式”,做了如下实验:
#include <iostream>

#include <string>

 

using   std::string;

 

using   std::cout;

 

extern int a  = 0;

 

int main()

{

     /* 验证“只有当extern声明位于函数外部时,才可以含有初始化式”*/

     extern int a  = 0;

 

     return 0;

}

VC2005下编译会提示“error C2205: 'a' : cannot initialize extern variables with block scope

 

6const
1)常量在定义后就不能被修改,所以定义时必须初始化。
2)常量仍然是左值,但是是不可修改的左值。
3)除非特别说明,在全局作用域声明的 const 变量是定义该对象的文件的局部变量。此变量只存在于那个文件中,不能被其他文件访问。——非 const 变量默认为 extern。要使 const 变量能够在其他的文件中访问,必须地指定它为 extern

 

7.引用
1const引用:指向const对象的引用。
2)非const引用:指向非const对象的引用。
3)非const引用只能绑定到与该引用同类型的对象。
3const引用可以绑定到不同但相关的类型的对象或绑定到右值。
 
8.枚举
1)枚举成员值可以是不唯一的,例:enum Points { point2d = 2, point2w, point3d = 3, point3w };
2)枚举类型的对象的初始化或赋值,只能通过其枚举成员或同一枚举类型的其他对象来进行。

 

9.头文件
对于头文件不应该含有定义这一规则,有三个例外。头文件可以定义类、值在编译时就已知道的 const 对象和 inline 函数。
值在编译时就已知道的 const对象是指用常量表达式初始化的const对象,这种const对象需放在头文件中。而对于不是常量表达式初始化的const对象而应该放在源文件中。