一、const
1、const 变量
const 修饰的对象转换为一个常量,不可被修改。
同一工程中const int val = 8全局常量val只作用在本文件中,即使另一文件用extern const int val声明也不行,需在定义时使用extern const int val = 8其他文件才可extern声明访问。
2、const 指针
int a = 1;
const int *a1;//表示p1指向的 整型不可修改
int const *a2;//同上 ;const都在 * 号的左边
int * const a3 = &a;//表示a3指针不可修改,只能指向a的地址;const在 * 号的右边
3、const 引用
当引用的对象是const对象时,引用也必须是const
const int val = 1024;
const int &refVal = val;
4、const 函数参数
传递过来的参数在函数内不可以改变,与上面修饰变量时的性质一样。
5、const 函数返回值
形如:
const int * fun1( ){ }
const int fun2( ){ }
(1)指针传递
如果返回const data,non-const pointer,返回值也必须赋给const data,non-const pointer。因为指针指向的数据是常量不能修改。
(2)值传递
如果函数返回值采用“值传递方式”,由于函数会把返回值复制到外部临时的存储单元中,加const 修饰没有任何价值。所以,对于值传递来说,加const没有太多意义。
6、const 成员函数和成员变量
成员函数
形如:
class A{
void fun(int x) const { }
};
(1)const修饰的成员函数,函数体中不能修改任何的成员变量(mutable修饰的变量除外)
(2)const成员函数不能调用非const成员函数,因为非const成员函数可以会修改成员变量
即:不能修改对象的成员变量且不能调用非const函数
成员变量
const成员变量不能在类定义时初始化,只能通过构造函数初始化列表进行。
7、const 类对象
非const对象可以调用const和非const成员函数;const对象只能调用const成员函数,而不能调用非const成员函数
二、static
1、static 全局变量和函数(隐藏功能)
同一工程下,static修饰的全局变量和函数只在本文件中可见,未加static的全局变量和函数在整个工程中可见,但都要提前声明,全局变量声明加extern
2、static 局部变量(生存期长)
函数内的静态局部变量生存期为整个源程序,且只进行一次初始化。
3、static 变量(默认初始化为0)
未初始化的全局静态变量和局部静态变量其默认值为0。全局静态变量、局部静态变量和未初始化的全局变量存放在BSS段。
4、static 成员变量和成员函数
static成员变量和成员函数 属于一个类,而不属于此类的任何特定对象。
static静态成员变量不能在类的内部初始化。在类的内部只能声明且要加static,定义必须在类的外部且不能加static。
const static(同static const)成员变量可以在类的定义体中初始化,但定义仍在外面,只不过可以不赋初值。
static静态成员函数只能调用 静态成员函数和静态成员对象。且静态成员函数不能声明为const,virtual,volatile。
全局变量、文件域的静态变量和类的静态成员变量在main执行之前的静态初始化过程中分配内存并初始化;局部静态变量(一般为函数内的静态变量)在第一次使用时分配内存并初始化。这里的变量包含内置数据类型和自定义类型的对象。