跳转到内容

2.1 初识声明,类型与对象

在 C++ 中,声明可以将一个标识符与一个类型或者对象联系起来。

为了理解声明的作用,这里我们也简要介绍一下类型和对象的概念。

在 C++ 中,内存的基本单位是字节。一个对象占据内存中的一块区域,也即多个连续的字节(可能是0个)。

并且,对象具有一个类型。对象的类型决定了对象的值的集合,以及对象上可以进行的操作。

当我们声明一个对象时,需要指定对象的类型;通过声明,我们创造了这个对象。

举例而言,在关键字中提到了 int,这个关键字表示的是整数类型。整数类型的对象具有整数值,并具有整数运算的行为。

假设我们已经有整数类型的对象 a、b和c,我们可以对a、b进行加法运算,然后把结果赋值给 c:

c = a + b

由于 a、b和c都是整数类型的对象,所以这个计算符合整数加法的规则。例如,如果 a 和 b 的值分别是 1 和 2,那么 c 的被赋予的值将是 3。

而如果 a 或者 b 不是整数类型,那么这个计算的规则就不一定是整数加法了。

在 C++ 中,声明的形式是:类型 标识符; 或者 类型 标识符 初始化器;。不要忘了最后的分号 ;,这个分号表示声明的结束。

初始化器有很多形式,在这一章节中我们只介绍最简单的形式,即 = 字面量。

举例而言,下面的代码声明了一个整数类型的对象 a:

int a;

上面这个声明的作用是创造一个整数类型的对象,将标识符 a 与这个对象联系起来。这样,我们就可以使用 a 来表示一个整数类型的对象。

在声明的同时,我们也可以对对象进行初始化。例如:

int b = 42;

这个声明的作用是创造一个整数类型的对象,将标识符 b 与这个对象联系起来,并且将 b 初始化为整数值 42。

以没有初始化器的形式声明一个对象的时候,对象被默认初始化,此时这个对象被初始化为一个不确定的值。例如:

int c; // c 的值是不确定的

这个不确定值可能是内存中的垃圾值,也可能是编译器生成的特殊值,没有可以确定的性质(注意:随机性也是一种性质,程序员不能确定这个值具有随机性)。

如果一个对象的值是不确定的,使用其值会导致错误,例如:

int c;
int d = c; // 错误:c 的值是不确定的

为了方便这一章的理解,以及避免引入过多的概念造成理解困难,这里介绍几种基本的类型。

  • int 是整数类型,此类型的对象可以存储整数值。例如:42、-42 这样的字面量都是整数值(注意没有后缀),可以用这样的字面量来初始化整数类型的对象。
    • C++ 规定 int 类型的对象至少占用2个字节。在常见的机器上,int 类型的对象占用4个字节。
  • bool 是布尔类型,此类型对象可以存储逻辑值。例如:true、false 这样的字面量都是布尔值,可以用这样的字面量来初始化布尔类型的对象。
    • C++ 没有规定 bool 具体占用多少字节。在常见的机器上,bool 类型的对象占用1个字节。
  • char 是字符类型,此类型对象可以存储字符。例如:'a'、'b' 这样的字面量都是字符值,可以用这样的字面量来初始化字符类型的对象。
    • C++ 规定 char 类型的对象占用1个字节。

当需要的类型和提供的类型不一致时,C++ 会尝试进行一些简单的转换。简单转换不是术语,只是 C++ 的转换规则中的一部分,为了描述需要,这里专门提出来一部分。

例如,当我们需要一个整数类型的对象,但是提供的是一个字符类型的对象时,C++ 会尝试将字符类型转换为整数类型。

int a = 'a';

这个声明的作用是将标识符 a 与整数类型联系起来,并且将 a 初始化为字符 'a' 以 ASCII 编码对应的整数值(即 97)。

目标类型提供类型提供的值得到的值
intbooltrue1
intboolfalse0
boolint0false
boolint任意非零值true
boolchar\0false
boolchar非\0值true
charbooltrue'\1'
charboolfalse'\0'