1. static 关键字:
用static可以声明 静态变量,它存储在静态存储区中,它的生命周期 在整个程序运行期间 都存在。
-
静态局部变量:
-
参考之前
-
-
静态全局变量:
-
参考之前
-
-
类中的静态成员
在类中,被static声明的成员称为静态成员,包括 静态成员变量 和 静态成员函数:
-
静态成员变量:
-
该变量 属于这个类本身 而不是 某一个对象,所有的对象 共享这个变量
-
在类内声明,在类外初始化
-
和静态局部变量不一样,它的值是可以被多次赋值的
-
-
静态成员函数:
-
同理,表示所有对象 共享这个函数
-
它内部可使用的变量也有限制:没有this指针,只能访问 静态成员变量;
-
静态成员函数的调用可以不通过创建 类的实例,而是直接通过 类名 调用
-
它不能被声明为const、volatile和虚函数
-
-
-
多线程
-
static变量 如果被 多线程 访问,需要特别注意 线程安全 问题
-
2. const关键字:
-
用const可以声明 常量变量,使变量不能被修改,且在定义时必须初始化
-
const形参可以接收const和非const实参
-
类内:
-
const修饰成员变量:不能在类外初始化,必须在构造函数初始化列表中初始化。
-
const修饰成员函数:不能改变变量的值(除非用mutable修饰过)
-
const修饰对象:const对象只能调用const成员函数;非const对象都可以调用
-
-
可以用于定义 常量指针 和 指针常量,
-
常量指针 表示这个指针所指向的是一个常量。我们不能通过这个指针 来修改它所指向的值,但是指针本身的值,也就是 它所指向的地址 是可以改变的(const在*p之外)
#include "stdio.h" void main(void) { int const *p=NULL;//常量指针 //等效于 const int*p=NULL; int a=10; p=&a;//进行地址赋值 printf("%#x--%#x\r\n",p,&a);//打印地址值 printf("%d--%d\r\n",a,*p);//打印数据值 }
-
而指针常量 是指 指针本身是常量,也就是说 一旦被初始化,它所指向的地址 就不可更改了。但是 它所指向的数据是可以被修改的(const在*P之间)
#include <stdio.h> int main(void) { int a=10; int *const p=&a;//初始化时赋值a的地址 //即int *(const p)=&a; *p=20; printf("%#x--%#x\r\n",p,&a); printf("%d--%d\r\n",a,*p); }
-
也可以同时使用 两个const关键字 来修饰 指针,使得它既是 常量指针,又是 指针常量,也就是 它所指向的数据 不能被修改,同时 它本身的值 也不能被修改
-
-
const也具有隐蔽性,被const修饰的变量不能被其他文件使用(链接都是内部的,所以其他文件也可以定义相同的名字的变量;而且头文件也可以包含const变量,但不能包含全局变量)
3. 有时候 static 和 const 可以组合使用,如 static const 变量,表示一个静态的常量
总之,static 用于 创建类的静态成员,const 用于 定义常量