您的位置:首页 > 编程语言 > C语言/C++

C++类之static

2016-06-02 08:07 471 查看
常见的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;
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: