第二章 变量和基本类型
2.1 基本内置类型
类型 | 最小存储空间 |
---|---|
bool | - |
char | 8 |
wchar_t | 16 |
short | 16 |
int | 16 |
long | 32 |
float | 6位有效数字 |
double | 10位有效数字 |
2.3.3 定义对象
- 初始化有
直接初始化
和复制初始化
;复制初始化
的语法是=
,直接初始化
的语法是()
。
2.3.4 变量初始化规则
- 内置变量的初始化:内置类型变量是否进行自动初始化取决于变量定义的位置。在函数外部定义的变量自动初始化位0;在函数体内部定义的变量不进行自动初始化。
- 未初始化变量引起的错误难以发现,不要依赖未定义行为。
- 类类型变量的初始化:每个类都定义了该类型的对象怎样进行初始化。类通过定义一个或者对个构造函数来控制类对象的初始化(2.3.3节)。如果定义某个类的变量时没有提供初始化式,需要通过
默认构造函数
进行初始化。
2.3.5 声明和定义
-
变量
的定义:用于为变量分配存储空间,还可以为变量指定初始值。在一个程序中,变量有且仅有一个定义。 -
声明
:用于向程序表明变量的类型和名字。定义
也是声明
:当定义变量时声明了它的类型和名字。可以通过使用extern
关键字来声明变量名而不定义它。
2.4 const限定符
- 定义一个变量代表某个常数的方法时变量是可以被修改的。
const
限定符提供了一个解决办法,通过const int bufSize = 512
将变量bufSize
限定为常数,任何修改bufSize
的尝试都会导致编译错误。 - 因为常量在定以后不能进行修改,所以定义时必须进行初始化。
- 与其他变量不同,在全局作用于声明的
const变量
是定义该对象文件的局部变量
,不能被其他文件访问。通过指定const变量
为extern
,就可以在整个程序中访问const对象
。 -
非const变量
默认为extern
,要使const变量
能够在其他文件中被访问,就需要显示的指定它为extern
。
2.5 引用
-
引用(reference)
就是对象的另一个名字。在实际程序中,引用主要用作函数的形式参数。 -
引用
是一种复合类型(compound type)
,通过在变量名前添加&
符号定义。 -
复合类型
是指用其他类型定义的类型。不能定义引用类型的引用,但可以定义任何其他类型的引用。 -
引用
必须用与该引用同类型的对象初始化。 -
引用
是别名,所以作用在引用上的所有操作都是作用在该引用绑定的对象上。 - const引用
const int ival = 1024;
const int &refVal = ival; //ok
int &ref2 = ival; //error
//legal for const references only
int i = 42;
const int &r = 42;
const int &r2 = r + i;
//将引用绑定到不同的类型时,最容易理解。
double dval = 3.14;
const int &ri = dval;
//编译器会将这些代码转换为如下的形式的编码:
int temp = dval;
const int &ri = temp;
- 如果ri不是const,那么可以给ri赋新值,这样做不会修改dval,而是修改了temp。仅允许
const引用
绑定到需要临时使用的值完全避免了这个问题,因为const引用
是只读的。 -
非const引用
只能绑定到与该引用同类型的对象;const引用
则可以绑定到不同但相关的类型的对象或绑定到右值。
2.6 typedef名字
typedef
通常被用于以下三种目的:
- 为了隐藏特定类型的实现,强调使用类型的目的。
- 简化复杂的类型定义,使其容易理解。
- 允许一种类型用于多个目的,同时使得每次使用该类型的目的明确。
2.9.1 设计自己的头文件
- 头文件用于声明而不是用于定义。但是有三个例外:头文件可以定义类、值在编译时就已知的const对象和inline函数,这些实体可以在多个源文件中定义,只要每个源文件中的定义时相同的。
2.9.2 预处理器的简单介绍
- 避免多重包含可以使用如下代码段:
#ifndef __SALESITEM_H
#define __SALESITEM_H
...
...
#endif
-
< >
一般表示该头文件是标准头文件,编译器将在预定义的位置查找该文件;" "
一般认为不是系统头文件,查找开始于源文件所在的路径。一般" "
查找范围更大。