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 类型变量使用

在C++语音中类的静态数据成员在初始化时比较特殊,以为它并不是在类的定义中初始化,而是在类的定义外被初始化。如下示例:#include"iostream" #include"string.h" cl...
  • u012248972
  • u012248972
  • 2016年06月11日 20:09
  • 1543

C++static静态成员函数

静态成员函数   静态成员函数和静态数据成员一样,它们都属于类的静态成员,它们都不是对象成员。因此,对静态成员的引用不需要用对象名。   在静态成员函数的实现中不能直接引用类中说明的非静态...
  • pamchen
  • pamchen
  • 2013年03月04日 09:44
  • 22617

C++static类成员,static类成员函数

1.static类成员 在C++primer里面说过,static类成员不像普通的类数据成员,static类数据成员独立于一切类对象处在。static类数据成员是与类关联的,但不与该类定义的对象有任何...
  • u014453898
  • u014453898
  • 2017年03月20日 14:33
  • 1163

c++ static的作用,以及static对象在类和函数中区别

static对象如果出现在类中,那么该对象即使从未被使用到,它也会被构造以及析构。而函数中的static对象,如果该函数从未被调用,这个对象也就绝不会诞生,但是在函数每次被调用时检查对象是否需要诞生。...
  • dqjyong
  • dqjyong
  • 2012年09月13日 21:38
  • 12593

关键字static的作用是什么? C++类中的静态成员变量和静态成员函数的作用

本文转自《面试宝典》 1,函数体内static变量的作用范围为该函数体,不同于auto变量,该变量的内存只被分配一次,因此其值在下次调用时,仍维持上次的值;...
  • taotaoah
  • taotaoah
  • 2016年10月17日 22:12
  • 1583

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

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

c++ 类中static变量初始化问题

首先static变量只有一次初始化,不管在类中还是在函数中..有这样一个函数: [c-sharp] view plain copy  print? v...
  • myth_HG
  • myth_HG
  • 2017年01月17日 09:49
  • 2541

c++ private static 成员变量如何初始化?

用c++实现单例设计模式的时候,初始化private static 成员变量折腾了一把,这种细节确实记得不清楚。 #include using namespace std; class Singl...
  • feigegegegegegegeg
  • feigegegegegegegeg
  • 2016年11月22日 15:20
  • 2281

[C++]class内的static方法指针

class内的static方法指针
  • adream307
  • adream307
  • 2016年03月29日 22:58
  • 368

C++中的const,static const和static类成员的初始化问题

C++中, const, static const, static这三种类成员的初始化容易出问题: const 作为类成员,只能在构造函数初始化列表中被初始化; static 作为类成员,所有类对象共...
  • HKaisa
  • HKaisa
  • 2016年05月08日 21:13
  • 1052
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++类之static
举报原因:
原因补充:

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