一、关键字static、const、extern、volatile作用
1、const
1.修饰常量
用const修饰的变量是不可变的,修饰后的变量只能使用,不能修改。
2.修饰指针
如果const位于*的左侧,eg:const int* a,则const就是用来修饰指针所指向的变量,此时为常量指针,即指针指向*a为常量;
如果const位于*的右侧,eg:int* const a,const就是修饰指针本身,此时为指针常量,即指针本身a是常量。
const int* p = &a; // 常量指针;指针指向的内容不能变,*p不能变
int* const p = &a; // 指针常量;指针本身不能变, p不能变
3.修饰函数参数
用const修饰函数参数,传递过来的参数在函数内不可以改变。
void func (const int &n)
{n = 10; // 编译错误
}
2、static (静:是一种约束,不能乱跑,乱动)
1.修饰变量
(1)修饰局部变量
局部变量没有被static修饰: 存储在栈中 自动初始值不固定
局部变量被static修饰: (叫做局部静态变量)存储在全局数据区 初始化为0
代码运行,分析:
子函数变量中不加static进行修饰
#include <stdio.h>void test()
{static int a = 0;a++;printf("%d ", a);
}
int main()
{int i = 0;for (i = 0; i < 8; i++){test();}return 0;
}
子函数中加static进行修饰
#include <stdio.h>void test()
{static int a = 0;a++;printf("%d ", a);
}
int main()
{int i = 0;for (i = 0; i < 8; i++){test();}return 0;
}
(2)修饰全局变量
全局变量定义在函数体外部,在全局数据区分配存储空间,且编译器会自动对其初始化。
全局变量没有被static修饰: 整工程所有文件可以用这个全局变量(其它文件使用时候需要extern外部声明)也就是说其他文件不能再定义一个与其相同名字的变量了(否则编译器会认为它们是同一个变量)。
全局变量被static修饰:静态全局变量仅对当前文件可见,其他文件不可访问,其他文件可以定义与其同名的变量,两者互不影响。
static定义全局变量的作用:在定义不需要与其他文件共享的全局变量时,加上static关键字能够有效地降低程序模块之间的耦合,避免不同文件同名变量的冲突,且不会误使用。
2.修饰函数
在函数的返回类型前加上static,就是静态函数。
静态函数:只能在声明它的文件中可见,其他文件不能引用该函数,不同的文件可以使用相同名字的静态函数,互不影响。
非静态函数:可以在另一个文件中直接引用,甚至不必使用extern声明。
3.C++面向对象中static用法
(1)类内静态数据成员
作用:实现多个对象共享数据的目标。
static 成员变量属于类,不属于某个具体的对象,即使创建多个对象,也只为 m_total (下面程序中)分配一份内存,所有对象使用的都是这份内存中的数据。当某个对象修改了 m_total,也会影响到其他对象。
class Student{
public:Student(char *name, int age, float score);void show();
public:static int m_total; //静态成员变量
private:char *m_name;int m_age;float m_score;
};
(2)使用方法
初始化静态成员变量:
static 成员变量的内存既不是在声明类时分配,也不是在创建对象时分配,而是在(类外)初始化时分配。反过来说,没有在类外初始化的 static 成员变量不能使用。
int Student::m_total = 0;
静态成员变量访问:
static 成员变量既可以通过对象来访问,static 成员变量不占用对象的内存,而是在所有对象之外开辟内存,即使不创建对象也可以访问。具体来说,static 成员变量和普通的 static 变量类似,都在内存分区中的全局数据区分配内存。
//通过类类访问 static 成员变量
Student::m_total = 10;
//通过对象来访问 static 成员变量
Student stu("小明", 15, 92.5f);
stu.m_total = 20;
//通过对象指针来访问 static 成员变量
Student *pstu = new Student("李华", 16, 96);
pstu -> m_total = 20;
3、extern
1.修饰变量
若一个变量需要在同一个工程中不同文件里直接使用或修改,则需要将变量做extern声明。只需将该变量在其中一个文件中定义,然后在另外一个文件中使用extern声明便可使用,但两个变量类型需一致。
方式一:
在1.c中定义全局变量
int i; 在2.c和3.c中都用
extern int i;声明一下就可以使用了
方式 二:
在头文件a.h 中声明
extern int i; 在其他某个c文件中定义
int i =0; 其他要使用i变量的c源文件只需要include"a.h"就可以
2.修饰函数
在定义函数时,如果在函数首部的最左端冠以关键字extern,则表示此函数是外部函数,可以供其他文件调用。C语言规定,如果在定义函数时省略extern,则隐含为外部函数。在文件中要调用其他文件中的外部函数,则需要在文件中用extern声明该外部函数,然后就可以使用。
和定义全局变量 方式二比较相同呢。
4、volatile
参考文章:
c语言中static关键字用法详解_static在c语言中的用法_guotianqing的博客-CSDN博客
C++ static静态成员变量详解 (biancheng.net)