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++类static成员

由题目,这里只讨论类中的static作用(类的静态成员),即两点:static数据成员 和 static成员函数。 静态成员的提出:为了解决数据共享问题。 当然全局对象也可以实现数据共享,但相比,s...
  • heyabo
  • heyabo
  • 2013年03月16日 21:47
  • 3825

static 在C++类中的作用

2017年4月8日 22:53:14 百度了一下,以后好背。。。 在类中声明static变量或者函数时,初始化时使用作用域运算符来标明它所属类,因此,静态数...

C++类中的静态成员函数--static

为了能方便访问静态数据成员,C++定义了一种特殊的成员函数来

c++类static成员

c++类的staic成员包含变量和函数两方面,我总是比较健忘,一段时间不写c++,又有点忘记了,总结下会好一些的,staic成员共同的特点是类,不属于任何对象。网上也有好多文章谈论这些,不过今天除了谈...

C++ 类中的static成员的初始化和特点

C++ 类中的static成员的初始化和特点在C++的类中有些成员变量初始化和一般数据类型的成员变量有所不同。以下测试编译环境为:gcc version 5.4.0 20160609 (Ubuntu ...
  • men_wen
  • men_wen
  • 2017年03月21日 15:53
  • 615

C++类的const, static 和inline成员函数(变量)

在C++类的声明中包含多个函数或变量的声明或定义。这些函数和变量可以分为以下几类,这几类并不是完全没有交集的,常量成员函数可以是内联成员函数,内联成员函数也可以是常量成员函数: 普通成员函数和变量 ...

C++:类内static成员

static成员是与类相关的,而不是与类的各个对象保持关联。实际上,这在一定程度上减少了资源开销。想象类内某const int size,每个对象的值都应当是相同的,如果单纯的将其定义为const成员...

c++-类的static成员

有时我们需要一种所有的类对象所共享的成员,例如可以统计类对象的个数:...

C++ 类成员变量初始化 static / const / auto

1. auto 类型的成员变量可以使用默认构造函数初始化 2. const 类型成员变量:如果显示的写出了构造函数,则必须在构造函数中初始化,如果没有写构造函数,则可以正常编译 3.static ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++类之static
举报原因:
原因补充:

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