写在前面:
C++中的所有成员(包括函数和变量)都具有作用域、可见域、生存期、存储域、可变性几个概念。所有的成员都可以用这个几个概念去分析和区分。
{}就定义了可见域
private/pretoct/public就定义了可见域
static关键字就定义了可见域、生存期、存储域
const就定义了可变性
static关键字首先继承了C语言中关键字的语义:
1、如果修饰局部变量,这此局部变量变为全局变量(但也此变量也只在作用域可见),并且只初始化一次;
2、如果修饰全局变量或者函数,则表示此全局变量和函数只在此文件中可见。
在C++中,上述的功能肯定具有,但除了上述的功能外,还有其他功能。
(其实还是从static能够修饰的成员来进行理解)
static可以修饰:(前3个是C中的就有的对象)
1、全局变量(注:对象也属于变量);
2、局部变量;
3、全局函数;
4、类定义中的成员变量;
5、类定义中的成员函数。
4、修饰类定义中的成员变量:
作用:把此成员变量提升为全局变量,其可以独立于对象而存在。主要用于同一个类中的所有对象共享同一个属性或进行数据通信。
注意:1、其必须在进行初始化;
2、当其和public关键字结合时,其和全局变量基本上没有区别,因为可以同个“类名::变量名”进行全局访问;
3、但当其和private关键字结合时,其和全局变量就有区别了,其进行了隐藏,只能够在类内(比如类的静态成员函数中)或者实例化的对象方法中访问了;
4、其比全局变量的另一个区别是其没有进行全局命令空间(相当于他的名字为"类名::变量名"),不会和其他全局变量名相冲突。
5、修饰类定义中的成员函数:
作用:也是使成员函数独立对象而存在,其可以在未创建任意一个对象时就存在了;所以其不能访问类中的非静态成员(包括成员变量和成员函数)。
注意:1、非静态成员函数,其实是每一个函数都具有一个默认的this指针作为形参,方便知道是哪个对象调用的它;但是由于静态成员函数不属于任何对象,所以没有this指针的参数;
2、非静态成员可以随意的访问静态成员,但是反之不行(万一未实例化对象,则访问的成员不存在,会出现异常);
3、由于静态成员函数没有this指针的额外开销,所以静态成员函数的访问(可以在编译时就进行处理)要比非静态成员函数快;
4、静态成员函数的访问也有两种。
思考:
若修饰类定义中非静态成员函数中的局部变量又会怎样呢?(可以进行验证)