【第22期】观点:IT 行业加班,到底有没有价值?

C++类之static

原创 2016年06月02日 08:07:22

常见的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;
};
版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

c/c++ 类static(解析)

C++静态数据成员(static member)—静态成员的初始化不应该在头文件中,静态数据成员被类的所有对象共享、包括派生类的对象,在类中可以声明所属类自己的静态数据成员对象、不可以定义非静态数据成...

C++ VS C#(12):函数的重载,类成员的static修饰,属性

//=====================================================================//TITLE:// C++ VS C#(12):函数的重载,类成员的static修饰,属性//AUTHOR:// norains//DATE:// Monday 04-April-2011//Environment:// Visual Studio 2010// Visual Studio 2005//=================================

c++类模板遇上static关键字

前言:  在c++中我们可以使用 static 关键字来把类成员定义为静态的。当我们声明类的成员为静态时,这意味着无论创建多少个类的对象,静态成员都只有一个副本。静态成员在类的所有对象中是共享的。如...
  • ydxlt
  • ydxlt
  • 2016-04-10 21:42
  • 1357

C++主题年技巧积累#2——我被static撞了一下腰

&lt;iframe align="center" marginwidth="0" marginheight="0" src="http://www.zealware.com/csdnblog.html" frameborder="0" width="728" scrolling="no" height="90"&gt;&lt;/iframe&gt; C++

C++主题——static类成员

C++主题——static类成员1.用static可以为类类型的所有对象所共有,像是全局对象,但又被约束在类类型的名字空间中。2.可以实施封装,将其放在private或protected区域中。3.s...
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)