6、关键字
6.1、static和const
1、static
静态变量,存储在全局数据区,其他文件不能使用extern引用static全局变量
1)隐藏性
当编译多个文件时,所有未加static的全局变量和函数都具有全局可见性。
2)保持变量内容的持久:
(static变量中的记忆功能和全局生存期)**存储在静态数据区的变量会在程序刚开始就初始化(唯一一次)。共有两种变量存储在静态区:全局变量和静态变量(static变量),static变量可以控制变量的可见范围–隐藏性。
3 )默认初始化为0
static变量和全局变量都具备默认初始化为0。
4)C++中类成员声明static
- 函数体内static变量的作用范围为该函数体,不同于auto变量,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值;
- 在模块内的static全局变量可以被模块内所用函数访问,但不能被模块外其它函数访问;
- 在模块内的 static函数只可被这一模块内的其它函数调用,这个函数的使用范围被限制在声明它的模块内;
- 在类中的 static成员变量属于整个类所拥有,对类的所有对象只有一份拷贝;
- 在类中的static成员函数属于整个类所拥有,这个函数不接收this指针,因而只能访问类的 static成员变量
类内:
- static类对象必须要在类外进行初始化 static修饰的变量先于对象存在,所以 static修饰的变量要在类外初始化;
- 由于static修饰的类成员属于类,不属于对象,因此 static类成员函数是没有this指针的,this指针是指向本对象的指针。正因为没有this指针,所以 static类成员函数不能访问非static的类成员,只能访问static修饰的类成员;
- static成员函数不能被virtual修饰, static成员不属于任何对象或实例,所以加上 virtual没有任何实际意义;静态成员函数没有this指针,虚函数的实现是为每一个对象分配一个vptr指针,而vptr是通过this指针调用的,所以不能为 virtual;虚函数的调用关系,this-vptr-vtable–virtual function
5) static变量初始化问题
只能初始化一次,但可多次赋值,在程序执行之前,编译器就已经分配好内存。C++引入对象后,要进行初始化必须执行相应构造函数和析构函数,要在首次使用时才能进行构造,并通过atexit()来管理。在程序结束后,按照相反的方向析构。
6)深究问题
原文链接:https://blog.csdn.net/ypshowm/article/details/89030194
7)static的不同形式
-
static局部变量,数据存储于进程的全局数据区(可以理解为位于函数体内部的全局变量,效果是差不多的,即使函数返回,它的值也会保持不变)
-
static全局变量,静态全局变量,限制此变量作用域就在一个源文件内,其他文件不能用extern来引用这个文件内的static全局变量。在定义不需要与其他文件共享的全局变量时,加上static关键字可以有效的降低程序模块之间的耦合,避免不同文件同名变量的冲突,并且还不会误用;
-
static函数,与static全局变量类似,静态函数只能在声明它的文件中可见,其他文件不能引用该函数
-
static数据成员,在类内数据成员的声明前面加上static关键字,其特点:
- 静态数据成员存储在全局数据区,静态数据成员在定义时分配存储空间,所以不能在类声明中定义;
- 静态数据成员是类的成员,无论定义了多少个类的对象,静态数据成员的拷贝只有一个,且对该类的所有对象可见。也就是说对任一对象都可以对静态成员进行操作(一处变了处处就会变),但对于非静态成员,每个对象都有自己的一份拷贝;
- 静态数据成员在全局数据区,所以它不属于任何对象,在没有任何对象的时候,就可以进行操作(不需要new一个对象);
- 静态数据成员也遵循public、protected、private访问规则
-
static成员函数:静态成员函数不属于某个对象,而是整个类
- 静态成员函数没有this指针,因为它无法访问属于类对象的非静态成员,也无法访问非静态成员函数,只能调用静态的成员或函数;
- 非静态成员函数可以任意地访问静态成员函数或静态数据成员。
static成员变量与全局变量的区别:
- 可以实现信息隐藏,通过private成员;
- 静态数据成员不存在与程序中其他全局变量名字冲突的可能性,因为它是类的成员
static总结
1)不考虑类的情况
- 隐藏。所有不加static的全局变量和函数具有全局可见性,可以在其他文件中使用,加了之后只能在该文件所在的编译模块中使用
- 默认初始化为0,包括未初始化的全局静态变量与局部静态变量,都存在全局未初始化区
- 静态变量在函数内定义,始终存在,且只进行一次初始化,具有记忆性,其作用范围与局部变量相同,函数退出后仍然存在,但不能使用
2)考虑类的情况
- static成员变量:只与类关联,不与类的对象关联。定义时要分配空间,不能在类声明中初始化,必须在类定义体外部初始化,初始化时不需要标示为static;可以被非static成员函数任意访问。
- static成员函数:不具有this指针,无法访问类对象的非static成员变量和非static成员函数;不能被声明为const、虚函数和volatile;可以被非static成员函数任意访问
2、const
1)const指针
- char* con