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个字节。
- C++ 规定
bool是布尔类型,此类型对象可以存储逻辑值。例如:true、false这样的字面量都是布尔值,可以用这样的字面量来初始化布尔类型的对象。- C++ 没有规定
bool具体占用多少字节。在常见的机器上,bool类型的对象占用1个字节。
- C++ 没有规定
char是字符类型,此类型对象可以存储字符。例如:'a'、'b'这样的字面量都是字符值,可以用这样的字面量来初始化字符类型的对象。- C++ 规定
char类型的对象占用1个字节。
- C++ 规定
当需要的类型和提供的类型不一致时,C++ 会尝试进行一些简单的转换。简单转换不是术语,只是 C++ 的转换规则中的一部分,为了描述需要,这里专门提出来一部分。
例如,当我们需要一个整数类型的对象,但是提供的是一个字符类型的对象时,C++ 会尝试将字符类型转换为整数类型。
int a = 'a';这个声明的作用是将标识符 a 与整数类型联系起来,并且将 a 初始化为字符 'a' 以 ASCII 编码对应的整数值(即 97)。
| 目标类型 | 提供类型 | 提供的值 | 得到的值 |
|---|---|---|---|
int | bool | true | 1 |
int | bool | false | 0 |
bool | int | 0 | false |
bool | int | 任意非零值 | true |
bool | char | \0 | false |
bool | char | 非\0值 | true |
char | bool | true | '\1' |
char | bool | false | '\0' |