2.1 基本内置类型
基本内置类型是C++“自带”的类型,区别于标准库定义的类型。使用时不需要应用标准库就可以使用,我们可以理解为数字型有下面这些
整形:就是整数或者是没有小数位的数。它包括bool(0,!0) , char, wchar_t(非标准英文字符用char无法全部表现所以需要这个类型来表示),short, int ,long。 整形中除了bool外其他类型可以是带符号,也可以是无符号的,无符号的取值范围不能为负,有符号取值可以有正有负,但由于有符号数所占位其中一位是符号位所以它的正数取值范围要比无符号范围小一位。
浮点型:就是带小数的数,包括float , double , long double他们之间的区别是取值范围和精度,可以根据你的需要选择合适的类型。
char , wchar_t 两个类型虽然都是字符型但区别比较大:
- 在宽度上来说,一个是1byte,一个是2byte(在linux上实际是4byte)
- 在编码上来说 wchar_t表示unicode编码方式
- 以上不同说明 wchar_t 可以包含更多内容比如中文,日文等等。
建议:使用double类型基本上不会有错,在float类型中隐式的精读损失是不能忽视的,而双精度计算的代价相对于单精度可以忽略
2.2 字面值常量
就是常量本身,比如 21, “name” 表示类两种类型的字面值。有些类型有多重表示法,比如数字可以用不同进制表示,浮点型可以用科学计数法书写等等。
以0开头的是八进制,以0x或0x开头的表示十六进制,转移字符用\表示
C++所有字符串字面值都由编译器自动在末尾添加一个空字符: ‘A’ vs “A”
2.3 变量
变量提供了程序可以操作的有名字的存储区
变量是对数据的有名存储,既然有名就可以对改数据做一些操作如赋值修改等等。这里有两个表达式概念先了解一下
左值:左值可以出现在赋值语句的左面或者右面
右值:右值只能出现在赋值语句的右面儿不能出现在左面
变量是左值,常量是右值,字面值常量也是右值
初始化(重要)
C++支持两种初始化变量的形式:复制初始化和直接初始化。复制初始化语法用等号(=),直接初始化则是把初始化式放在括号中
int ival(1024);
int ival = 1024;
int ival;// 没有初始化内容,它的值由系统分配规则是在栈区和堆区(函数内定义或者类里面定义)都取随机值,在全局区(全局常量,静态变量)都是全零值。
初始化不是赋值:初始化是创建变量并给他赋值,赋值则是擦除对象的当前值并用新值代替
对内置类型来说,复制初始化和直接初始化几乎没有差别
对类类型的对象来说,有些初始化仅能用直接初始化完成
声明和定义
定义用于为变量分配存储空间
声明用于向程序表明变量的类型和名字,可以用extern关键字声明变量而不是定义它,extern是说明变量定义在程序的其他地方
注意如果声明有初始化式,那么可以被当作定义,即使声明标记为extern
extern double pi = 3.1415 //定义
变量必须且仅能定义一次,而且在使用变量之前必须定义或声明变量
一个文件含有变量的定义,使用变量的其他文件包含变量的声明
2.4 const限定符
限定符表示定义一个常量,常量一但定义则不可更改,所以必须在定义时初始化。
常量分为两类 编译时常量 和 运行时常量(在.NET中标示为readonly) 编译时常量是定义后直接初始化的常量,运行时常量值要初始化的值必须要通过代码运行才可以确定的
2.5 引用
引用是别名
引用就是对某个对象的另外一个别名。引用最重要的作用是函数传参。
const引用,可以读取但不能修改
注意分清常量引用还是变量引用
变量引用
int val = ; int &refval = val; // 引用了一个变量 int &refval1 = ; // 错误,12是个字面常量,常量必须要用常量引用 refval = ; // 等价于 val = 2 常量引用
const int val = ; const int &ref1 = val; // 引用了一个一般常量 const int &ref2 = ; // 引用了一个字面常量 int &ref3 = val; // 错误,常量必须要使用常量引用,ref3是个变量引用
int var = ;
const int &ref2 = var // 常量引用指向了一个变量,这时候
refval2 = ; // 不允许通过常量引用来做任何更改操作
varval = ; // 但是可以用原始变量来更改内容
对于引用还有一点很重要:非常量引用类型必须严格匹配,常量引用可以在内置类型之间相互引用
double a = 123.4; int &b = a; // 错误,类型不匹配 const int &c = a; // ok
// 这个操作实际等同于
int temp = a;
const int &c = temp;
2.6 typedef
2.7 枚举
枚举是一组可选常量值,既然是一组可选值说明包含多个常量。枚举定义语法如下
enum val{val1 = 2, val2 = 4, val3} // 最后一个内容没有显示给值等价于 val3 = 5
如果不指定值默认第一个值从0开始下一个依次+1递增。
枚举的每一项都是一个唯一的const类型值,上面的定义有点类似于:
const val1 = 2; const val2 = 4; const val3 = 5;
由于是const的,所以 val2 = 1 或者 val a = 2; 都不允许。
枚举项和int类型值有对应关系,但是二者只能单向转换,枚举可以自动转成int,而int却不能转成枚举
2.8 类类型
2.9 编写自己的头文件
头文件用于声明而不是定义
一些const对象定义在头文件中,当const为常量表达式放在头文件中(常量表达式是编译器在编译时就能够计算出结果的表达式),原因是const变量默认时定义该变量的文件的局部变量,所以把它们的定义放在头文件中是合法的