1. 声明和定义
a. 声明可多次,定义只有一次
b. extern声明变量,而不定义,也不分配空间。只是用于向程序表明变量的类型和名字。
c. 定义用于为变量分配存储空间,还可以指定一个初始值,定义也是声明。
double pi; //definition
double pi = 3.14; //definition and initialize
extern double pi; //declaration
extern double pi= 3.14; //definition and initialize
d. 不要把定义放在头文件
2. 初始化形式
复制初始化copy initialization:用等号 -> int val = 1024;
直接初始化 directinitialization :用初始化式(推荐,更直接灵活) -> int val(1024);
初始化不是赋值,是创建对象并赋初值;赋值是擦除当前值,用新值代替。
3. 初始化规则
内置类型: 函数体外->初始化为0, 函数体内->不进行初始化
类类型: 自动调用类的默认构造函数,如果没有默认构造函数应该提供显示的初始化式
4. Const
a. Const对象定义后不能被修改,定义时必须初始化
b. Const对象默认为文件的局部变量,可通过extern使整个程序可以访问const对象。
extern const int bufsize = 100;
别的头文件:
extern const int bufsize;
c. Const对象可以放在头文件中
5. 引用
a. 引用是对象的另一个名字, 通过在变量名前加 &来定义
b. 引用必须用与该引用同类型的对象初始化
c. 必须初始化, 必须用对象初始化, 不可以将引用绑定到另一个对象上
d. 引用的底层实现应该是一个const指针,但是用变量的引用取地址和变量取地址是一样的, sizeof的结果也一样,引用就是变量的别名。 引用多用在参数传递和返回值类型
6. Const引用
a. Const引用是指向const对象的引用, 不能用非const引用指向const对象
const int val =1024;
const int &ref = val;
int &ref2 = val; //error
b. Const引用可以绑定到不同但相关的对象或者右值
int i = 42;
const int &r = 42; //OK
const int &r1 = I; //OK
double dval = 3.14;
const int &rd = dval;
编译器会变成:
Inttemp = dval; const int &ri = temp;
7. 左值右值
左值: 可以出现在赋值语句的左边或右边
右值:只能出现在赋值语句的右边
8. 指针
a. 指针用于指向对象,保存的是另一个对象的地址
&:取地址符, 只能用于左值
*:解引用, 获取指针所指向对象
b. 未初始化的指针是无效的,不会报错,但有风险. (有可能编译不会报错,但运行报错)对指针进行赋值或初始化只能使用以下类型:
-0值常量表达式 (NULL或者编译时可获得值的整型const或字面量)
-类型匹配的对象的地址(必须保证类型匹配)
c. void*指针指向一地址,但不清楚在此地址上的对象类型, 允许的操作:
-与另一地址比较
-向函数传递void*或者返回void*
-给另一个void*赋值
d. ptrdiff_t
e. const与指针
const double *cptr; //pointer to const double
int errNum = 0; int *const curErr = &errNum;//a const point to int
const指针不能修改,是指curErr不能指向其他对象,且定义时必须初始化
f. typedef与指针
typedef string *pstring; const pstring cstr; //const修饰的是pstring,所以等价于string *const cstr;
8. 数组
a. 数组长度固定的, 维度必须用值大于1的常量表达式定义, 非const变量或者运行时才知道其值的const变量都不行
c. 动态创建数组
-长度固定,但可以是运行时才获得的值
-可以一直存在,直到程序显示释放
-自由存储区或堆,用于存放动态分配的对象
C:malloc和free
C++:new和delete
-在自由存储区创建的数组对象是没有名字的,只能通过地址间接访问对象。
-用delete[]释放指针所指向的数组空间
9. 静态
a. 静态全局变量:在全局数据区分配, 作用域为本文件, 未经初始化的静态全局变量会被程序自动初始化为0
b. 静态局部变量: 该变量在全局数据区分配内存;
静态局部变量在程序执行到该对象的声明处时被首次初始化,以后的函数调用都不再进行初始化;
静态局部变量如果没有显示初始化,会被自动初始化为0.
始终驻留在全局数据区,直到程序运行结束。但其作用域为局部作用域,当定义它的函数或语句块结束时,其作用域随之结束
c. 静态函数
静态函数不能被其它文件所用
其它文件中可以定义相同名字的函数,不会发生冲突
10. cast:
dynamic_cast:静态类型为父类的对象转成子类对象, 会进行运行时类型检查
-如果指针类型的Dynamic_cast失败,返回0;引用类型的dynamic_cast失败,抛出bad_cast
const_cast:非const和const直接的转换
static_cast:编译器隐式执行的任何类型转换都是由它完成。