1.基本内置类型
1.1 算术类型
char类型比较特殊,它属于整型,但是对应着整数的ascll码值
wchar_t 宽字符 16位,它可以表示确保存放机器最大扩展字符集的任意字符
long long 数据类型是在C++11中新定义的,16位
1.2 如何选择类型
当明确不可能为负数的时候,选用无符号类型
使用int执行整数计算
执行浮点数运算使用double类型
2.类型转换
定义:将对象从一种给定的类型转换为另一种相关类型
signed char c = 256; // c的值未定义 ,当我们赋给带符号类型一个超出它范围值时,结果显示未定义的(undefined),无 符号类型的根据编译器不同,结果可能显示不同
切勿将带符号类型和无符号类型混用
3.变量
何为对象?通常情况下,对象是指一块能存储数据并具有某种类型的内存空间。
变量(对象)初始化: 初始化不是赋值,初始化是创建变量的时候赋予其一个初始值,而赋值含义是把当前值擦掉,用一个新值来代替
建议:当你第一次使用变量的时候再定义它
4.复合类型
一条声明语句由一个基本数据类型和紧随其后的声明符列表组成 (声明符不仅仅就是变量名,其实还有更复杂的,如&r(引用)、*p(指针))
4.1 引用
int & refVal2; // 报错,引用本身不是对象,必须初始化
引用本身不是对象,不能定义引用的引用 int &&r // 错误
4.2 指针
指针本身是个对象,存放着某个对象的地址,指针类型要与它所指向对象的类型严格匹配
&和*字符的多重含义
初始化所有的指针 未经初始化的指针在运行时会发生稀奇古怪的错误
int * p1,p2; // p1是指向int型的指针,p2是整型变量
int *p; int *& r=p; // r是对指针p的引用
面对一个复杂的指针或引用的声明语句时,从右向左阅读有助于弄清楚它的真实含义
5.const限定符
5.1 有时候,我们希望定义一种变量,它的值不会发生改变,可以用关键字const对变量类型加以限制
const对象一旦创建之后其值就不能再改变,所以const对象必须预先初始化
int i=36; const int ci=i; int j=ci; // 正确 ci是个整型常量,ci常量特征仅仅在执行改变ci特征时才起作用,拷贝一个对象的值并不会改变其自身,一旦拷贝完成,新的对象和原来对象之间没什么关系
有的时候,const变量必须在文件间共享,我们需要在file1.cpp中定义并初始化它 extern const int bufsize=20; file1.h中声明 extern const int bufsize;file2.h中extern const int bufsize声明,那么程序中bufsize是同一个变量,这样就做到了在文件间的共享
5.2const的引用
初始化常量引用时允许用任意表达式作为初始值
double dval =3.14; const int &ri=dval; // 正确 有双精度浮点数生成一个临时的整型常量 让ri绑定这个临时常量
int i=42; int &r1=i; const int &r2=i; r1=0; // 正确 r2=0; // 错误 r2是个常量引用
5.3指针与const
const double pi=3.14; double *ptr=π // 错误,ptr是个普通指针 const double *cptr=π // 正确 常量指针 *cptr=34; // 错误
所谓的常量指针 仅仅要求不能通过该指针改变对象的值,而没有规定这个对象的值不能通过其他途径进行改变
int errNumb=0; int *const curErr=&errNumb; // curErr一直指向errNumb
const double pi=3.14; const int *const pip=π // pip是一个指向常量对象的常量指针
int *const pi=&i; // 不能改变pi的值 但可以改变*pi的值
const int *p2=&i; // 允许改变p2的值,但是不允许通过*p2修改i的值 p2是个常量指针
6.类型别名
类型别名是一个名字,它是某种类型的同义词
typedef char *pstring;
const char *cstr=0; const pstring cstr=0; // 这两个定义不一回事 前者是声明了一个指向char的常量指针,后者是声明了一个指向const char的指针,有const 的地方 首先确定其 修饰的对象,然后就能明白其用意了
7. 预处理器的概述
(1)、真正程序运行之前,由编译器调用的独立程序,可以删除备注、包括其他文件及宏的替代。
(2)、过去的程序中一个名为NULL的预处理变量,当用到预处理变量的时候,预处理器会自动将它代替为实际值,因此NULL初始化和0初始化指针是一样的。
(3)、预处理功能还应用的#include中,看到#include标记时就会用头文件的内容去代替#Include
(4)、C++中还用到一个预处理功能是头文件保护符,头文件保护符依赖于预处理变量,预处理变量有两种状态,已定义和未定义,define指令将名字设定为预处理变量,#ifndef当且仅当变量未定义时为真,#endif为指令结束符,预处理名字最好都写成大写