下面是本章自己疑惑或重要的内容:
1.char的三种类型
书中原话:“和其他整型不同,
char 有三种不同的类型:
plain char 、
unsigned char 和
signed char。虽然
char 有三种不同的类型,但只有两种表示方式。可以使用
unsigned char 或 signed char 表示
char 类型。使用哪种
char 表示方式由编译器而定。”,也就是说,char c,c不是
unsigned char 就是
signed char,但这是由编译器决定的。但不管是什么类型,c都大到足以存储字符集中的任何字符。
2.将超出其范围的值赋给一个指定类型的对象时
1)当将超过取值范围的值赋给 un
signed 类型时,编译器会将该值对
unsigned 类型的可能取值数目求模。
2)当将超过取值范围的值赋给
signed 类型时,由编译器决定实际赋的值。
3.整型和浮点字面值规则
1)字面值整数常量的类型默认为
int 或
long 类型。其精度类型决定于字面值——其值适合
int 就是
int 类型,比
int 大的值就是
long 类型。通过增加后缀,能够强制将字面值整数常量转换为
long、
unsigned 或
unsigned long 类型。
2)默认的浮点字面值常量为
double 类型。在数值的后面加上
F 或
f 表示单精度。同样加上
L 或者
l 表示扩展精度。
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
4.C++变量初始化
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”
6.const
1)常量在定义后就不能被修改,所以定义时必须初始化。
2)常量仍然是左值,但是是不可修改的左值。
3)除非特别说明,在全局作用域声明的 const 变量是定义该对象的文件的局部变量。此变量只存在于那个文件中,不能被其他文件访问。——非 const 变量默认为 extern。要使 const 变量能够在其他的文件中访问,必须地指定它为 extern
。
7.引用
1)const引用:指向const对象的引用。
2)非const引用:指向非const对象的引用。
3)非const引用只能绑定到与该引用同类型的对象。
3)const引用可以绑定到不同但相关的类型的对象或绑定到右值。
8.枚举
1)枚举成员值可以是不唯一的,例:enum Points { point2d = 2, point2w, point3d = 3, point3w };
2)枚举类型的对象的初始化或赋值,只能通过其枚举成员或同一枚举类型的其他对象来进行。
9.头文件
对于头文件不应该含有定义这一规则,有三个例外。头文件可以定义类、值在编译时就已知道的 const 对象和 inline 函数。
值在编译时就已知道的
const对象是指用常量表达式初始化的const对象,这种const对象需放在头文件中。而对于不是常量表达式初始化的const对象而应该放在源文件中。
转载于:https://blog.51cto.com/yanjg/670772