const
const是一个常量关键字,主要是为了防止所修饰对象被修改。
我们在定义一个变量时,如果想要防止这个变量被修改,可以
用const来修饰这个变量。也就是说,被const修饰过的变量或者
函数,不能对其进行修改,否则,编译器就会报错
const 推出的初始目的,正是为了取代define预编译指令,消除它的缺点,同时继承它的优点。
/*用与修饰全局变量*/
#define PI1 3.14
const double PI2 = 3.14;
/*两种方式都可以用来定义全局变量。不过,第二种要比
第一种方式要好,使用宏定义的变量,其信息一般以表格
的形式储存在系统中,当我们在调试程序时,就有可能使
得这个宏定义的变量反复出现在符号表中。而const修饰
的变量会一直出现在符号表,使得我们调试方便许多。*/
/*用于修饰指针*/
const int *p1 = 100; //常量整形指针
int *const p2 = 200; //整形常量指针
常量整形指针,不能通过这个指针修改它所指向的变量,
指针本身是可变的。
整形变量指针,指针不可修改,但是指向的变量可以修改
/*用于表示函数的输入,输出*/
char *strcpy(char *buf,const char *str) //将str拷贝给buf
由于buf是需要修改的,所以不用const修饰,而str是传递数据进来
的,并不希望进行改变,所以可以用const修饰
/*修饰类成员函数*/
class student {
public:
student(int age) :_age(age) {}
void getAge()const { //不希望通过函数来改变类的私有变量
_age = 100; //错误,编译器会报警
cout << _age << endl;
}
private:
int _age;
};
/*如果我们在定义一个类的成员函数时,并不希望这个函数能够改变类的
私有变量,这时我们可以使用const将这个成员函数定义为常量函数,这样,
这个函数就不能修改私有变量了。*/
static
首先来明确一下全局变量和局部变量
全局变量:定义在函数之外的变量。全局变量可以为当前文件中其他函数所共用。
储存在静态数据库中。
在程序开始执行时分配存储区,程序执行完毕释放,在程序执行过程中全局变量始终占据固定的存储单元;
局部变量:定义在函数内部的变量
储存在堆栈中。
动态分配存储空间的,在调用变量所在函数时,系统会给函数内的局部变量分配存储空间,在函数结束时自动释放这些存储空间。
static修饰局部变量时:(比如在单例中、cellID、)
1.只会初始化一次,只有一份内存(重点 优化)
2.并没有改变变量的作用域,作用域仍然是这个局部
3.Static关键字可延长局部变量的生命周期,程序结束才会销毁
static修饰全局变量时:(只想在当前类被使用 工具类)
1.使全局变量的作用域仅限于当前文件内部,即当前文件内部才能访问该全局变量。(因为不用修饰的话,全局变量是可以被外部使用的,默认时 全局变量的作用域是整个项目文件)(重点)
2.避免重复定义全局变量
static修饰函数时:
该函数只能在当前源文件中访问
static不能修饰成员变量
参考:
静态变量的优点:
1、节省内存。静态变量只存储一处,但供所有该类的对象使用。
2、它的值是可以更新的。
3、可提高时间效率。只要某个对象对静态变量更新一次,所有的同类对象都能访问更新后的值。
extern
加上extern关键字可以在一个类中 访问其他类中 定义的全局变量
想要访问全局变量可以使用extern关键字
(如果不想让外部类访问全局变量,则可以在定义全局变量时加上static关键字。)
全局变量是不安全的,因为它可能会被外部修改,所以在定义全局变量时推荐使用static关键字修饰。
volatile
变量随时可以改变