第二章 变量和基本类型
关于C++的几篇博客,参考人民邮电出版社的《C++ Primer 中文版》一书。
2.1 基本内置类型 && 2.2 字面值常量
c++的基本内置类型包括:void类型、布尔值、单个字符、整型、浮点型(5种)。
其中:
void通常作为无返回值的函数的返回值类型。
布尔值bool,可以为其赋任何值,0即false,非0即true。
单个字符即c语言中的字符常量,unsigned char范围为0~255。
整型:默认为signed,如果想定义无符号的需要加上unsigned。表示signed整型最常见的策略是第一位为符号位,1表示负数,0表示正数。如果越界,则赋值时是取该值对该类型取值数目求模后的值。例如,如果将336赋值给unsigned char型,则实际上赋值为80。
浮点型:单精度float,双精度double,扩展精度long double。
字面值常量的几个规则:
1、20 //十进制decimal;024 //八进制octal;0x14 //十六进制hexadecimal (注意:八进制和十六进制开头的是数字0,不是字母o)
2、unsigned long型常量可表示为128UL或128LU
3、默认的整数常量为int或long型,默认的浮点数常量为double类型。
4、浮点字面值常量,默认为double,在后面加F或f表示单精度float,加上L表示扩展精度long double型。科学计数法表示浮点常量时,指数用E或e表示。举例:1E-3F,12.345L。
5、字符型常量用单引号。字符串型常量用双引号,并在末位增加一个空字符 '\0'。字符或字符串常量前面加L,能得到相应的wchar_t类型的宽字符或宽字符串。
6、不可打印字符和特殊字符都用转义字符书写。前者包括退格和空格等,后者包括单引号、双引号、反斜杠等。
7、两个相邻的仅由空格、制表符或换行符分开的字符串字面值,可自动连接成一个新字符串字面值。
2.3 变量
关于变量,我们必须回答这样几个问题:
什么是变量?变量的定义?变量的声明?定义和声明的区别?如何初始化?变量的作用域?
一、什么是变量?
变量,就相当于是为程序可以操作的一段存储区,起了个名字。对象,广义上泛指内存中一切具有类型的区域。
变量的类型,决定了分配给变量的存储空间的大小,以及可以在其上执行的操作。
二、变量的初始化和定义
关于初始化,需要建立以下几个概念:
1、初始化不是赋值,是两种不同的操作。这点比较微妙,暂时不做解释。
2、C++有两种初始化形式:复制初始化,如 int i=1000;直接初始化,如 int i(1000)。
对于内置类型,两种方式几乎无差别;对于class类型的对象,有些初始化只能用直接初始化完成。
3、默认的初始化
(1)对于内置类型
全局变量或静态变量,默认初始化为0或者NULL,也就是会自动做初始化。局部变量,如果不做显示的初始化,就是未定义的,默认值是无意义的,这样做是危险的。
(2)对于class类型
如果没做显示初始化,那么会使用默认构造函数进行对象的初始化。显示的初始化调用的是构造函数。
例:
std::string all_lines(10, '9'); // all_lines = "9999999999",调用了string类的一种已定义的构造函数。
std::string empty; // empty = " ",调用了string类的默认构造函数,该默认构造函数的作用是将empty默认初始化为空字符串。
三、变量的声明和定义的区别
1、定义,为变量分配存储空间;声明,只是告诉程序变量的类型和名字,说明其定义在其他地方,且存储空间已在其定义处分配好。广义上说,定义也是声明。
2、因为定义即分配存储空间,所以在一个程序中,相同含义的变量的定义只能出现一次,而声明可以出现多次。
3、使用变量前,必须先对变量进行定义或声明。任何在多个文件中使用的变量,声明和定义都必须是分离的。即,一个文件含有变量的定义,在其他文件中使用该变量时,需要先声明(而不是定义),再使用。
四、变量的作用域
变量的作用域,即变量的可见程序段或文件,一般是用大括号来界定的。
外部的变量,可以在内部作用域中被操作,也可以被重新定义。在内部重新定义的变量,将覆盖外部变量,且其作用域只限于内部。当内部作用域结束时,内部变量的存储区被释放,外部变量重新起作用,且其值仍然等于进入内部作用域之前的值。这是因为程序调用的主体永远是以存储块为单位的,并不是名字本身。(当然,我们一般不这样做,即内部作用域的变量名与外部起得一样,以免造成混淆。)