C++类之static

来源:互联网 发布:软件平台是什么 编辑:程序博客网 时间:2024/06/18 11:10

常见的static可以修饰全局变量和局部变量及函数。
1.static全局变量

当static修饰全局变量时,这个全局变量在全局数据区分配内存,若没有对static全局变量初始化,跟普通的全局变量一样会初始化为0(此处的0对于不同的类型0的含义也不同),这个全局变量的作用域仅限于当前文件,也就是说static全局变量只能用于当前文件,在其他文件中是不可见的,这可以很好的解决多个文件链接时命名冲突的问题。

在一段程序中,内存中一般有代码区,数据区,堆区和栈区,由malloc和new开辟的放在堆区,一般函数内的auto变量存在在栈区,auto变量会随着函数的结束自动释放空间,不需要手动释放,而堆上的空间需要手动通过free或delete进行释放。刚才也说到了,static全局变量时存放在全局数据区的,并不会因为函数的结束而释放(后面要说到的static局部变量亦是如此)

2.static局部变量
当static修饰局部变量时,并没有改变局部变量的作用域,和普通的局部变量的作用域是一样的,当函数结束时,其作用域也结束了。

前面说过static局部变量也是存放在全局数据区的,并不会随着函数的结束而释放空间,更具体点static局部变量存放在data的RW段(已被初始化为非0值的数据段)或是BSS段(未被初始化或被初始化为0值得数据段)。

static局部变量若没有初始化,则程序自动初始为0,static局部变量在程序执行到变量声明处首次被初始化,再次运行函数时,static局部变量保持上次的值不再初始化

3.static函数
static函数同static全局变量类似,作用域是当前文件,在其他文件中不可见,便于解决命名冲突问题。

上面三种是C中同样存在的用法,因为C++中多了类,自然也扩展了static在类中的用法:

1.static数据成员

(1)static数据成员在定义时就开辟了空间,但static数据成员并不在类的大小中, static数据成员属于类,也属于对象,但终归属于类,static数据成员对于对象来说共享的,对象的大小与类的大小是一样的,static自然不会在对象中占据空间。
(2)static数据成员只能在类外定义,且不能带着static关键字,如:

class A{    static int x;};int A::x = 0;

2.static成员函数

(1)static成员函数目的就是来管理static数据成员的,static成员函数没有this指针,对于普通成员函数来说,当不同的对象调用普通成员函数时,普通成员函数中会有一个this指针,指明使用哪个对象的数据成员,而static成员函数是共享的,即static成员函数属于类,也属于对象,但终归属于类。共享就代表不会去选择专属于对象的任何数据成员,那么也就是说static成员函数不能访问普通数据成员,也不能调用普通成员函数,因为static成员函数没有this指针,只能访问static数据成员。共享里面必须还是共享。

那如果假设static成员函数可以访问普通数据成员,也能调用普通成员函数,因为没有this指针,就需要计算机自己去选择这是谁的数据成员,谁的成员函数,之前的文章中也说过,计算机最不能接受的就是让他做选择,终归一句话:臣妾做不到啊,so就不准访问这些需要选择的东东。

下面画一个图,能较为清楚地看一下对象与普通数据成员,static数据成员,普通函数,static函数之间的关系。下面先定义一个类:

class A{private:    int x;    char y;    static int z;public:     int func();    static dispaly(){        cout << z << endl;    }};

int A::z = 0;

这里写图片描述

看懂这张图首先得明白,成员函数(不管是普通成员函数还是static成员函数)都是不在对象空间中的,类A的对象空间中只有数据成员,后面出现虚函数的时候再另说。

最后再说一点:static const 数据成员

static const数据成员显然是对象共享的,同时又不准修改的一种数据成员。
const数据成员必须在参数列表(也叫初始化列表)里进行舒适化,static数据成员必须在类外初始化,那static const数据成员怎么初始化呢?就地初始化:

class A{private:    static const int x = 10;};
1 0
原创粉丝点击