美文网首页
C++中static用法总结(静态对象,内存)

C++中static用法总结(静态对象,内存)

作者: 绿风烟 | 来源:发表于2020-02-19 13:57 被阅读0次

    要理解static关键字在C++中的所有作用,首先要明白程序所使用的不同内存区域的作用。

    关于不同的内存区域概念

    C++程序运行时使用三种内存,一种是static内存,还有一种是stack内存,以及heap内存(动态内存池)。

    1. static内存用于local static object,class static members,以及在函数外定义的全局对象。static对象在生成后一直存在,直到程序结束。static内存由编译器直接管理,程序无法控制。
    2. stack内存用于函数内定义的变量。stack内存中的对象只是在函数块执行期间存在。stack内存也是由编译器所管理。
    3. 每个程序都会拥有一个内存池,被称为free store或者heap,用于程序在运行时动态寻址的对象,这些对象的生存周期由程序负责管理,heap内存由程序所控制。

    static关键字其实主要限定了C++中的对象所使用的内存区域。下面根据static所应用对象的不同,分别从全局对象,本地静态对象,和类静态成员角度来解释static在C++中的作用。

    1.static在全局变量中的使用

    在全局变量上使用static关键字,被称为file static,为c和c++标准化前的功能。当在全局变量上使用static关键字,就意味着限制了这个对象只能在这个文件范围内使用。

    static在全局对象上的使用跟内存区域的使用没有直接关系,只是限定全局变量的使用范围。file static功能在c++标准化后已经被废弃。

    2.使用static生成本地静态对象(local static object)

    当在函数定义中使用static声明局部变量时,这个变量static内存中。在函数第一次执行时,当代码执行到static定义语句前,这个static本地变量被初始化,随后这个变量一直存在,直到程序结束。

    本地静态对象生成在static内存区域中。

    3. static在类中的使用

    static在类中主要用于生成类静态成员(class static member)。

    1. static的使用场合

    当要将成员变量或方法和class本身关联,而不是和类类型(class type)的对象关联,那么可以使用static来实现这个目的。

    2. static关键字所修饰的类成员(class member)的特点

    类静态成员变量和函数不属于任何类类型的对象,每个类类型的对象只拥有非静态的成员变量和函数。类静态成员被所有类类型的对象所共享,但不是类类型的对象本身的一部分。

    类静态成员被生成在static内存区域,由编译器直接管理。

    类静态成员函数的更多特征

    由于类静态成员函数不是类的对象的组成部分,所以,类静态成员函数不能拥有this指针,再进一步讲,在类静态成员函数体中不能直接引用类的非静态成员变量和方法。(因为非静态成员是类类型的对象的组成部分)

    类静态成员函数也不能被声明为const。

    3. 类静态成员的定义和初始化

    类静态成员函数和任何其它类成员函数一样,可以在类外定义并初始化。(注:在头文件中的只是类及类成员的声明)。

    在定义类静态成员函数时,可以不使用static关键字,也即是说static关键字只是在类静态成员的声明处是必需的。

    类静态成员变量定义的特别之处

    如果我们不明确定义类静态成员变量,那么类静态成员变量在类类型的对象生成时不会被定义,这是由于类静态成员变量不是类类型的独立对象的构成部分。

    类静态成员变量和全局变量相同,要在函数之外被定义。并且一旦被定义,就会在程序运行期间一直存在,直至程序结束。

    类静态成员变量可以和成员函数一样,在类外定义并且初始化,即便是私有的类静态成员变量。类静态成员变量初始化时还可以使用私有的类静态成员函数初始化,因为根据类的访问控制定义,类内部的成员可以访问私有成员,类静态数据成员定义初始化当然可以访问类的私有成员。

    4. 类静态成员的使用

    类静态成员可以通过”类+scope操作符(::)+类静态成员“方式直接使用,当然私有类静态成员只能在类内使用。

    类对象的成员函数可以直接使用类静态成员,并不需要scope操作符。

    虽然类静态成员并不是类类型的对象的组成部分,但是仍然可以通过对象、引用或者对象指针直接访问类静态成员。

    5. 类静态成员变量的特别用法

    1. 类静态成员变量的类型没有限制,可以使用类本身的类型来定义,但是类实例对象的成员变量被限制,最多只能使用类本身的指针类型定义,不能使用类本身的类型定义。
    2. 类静态成员变量可以被用作类中函数的默认参数。而非静态成员变量不能作为默认参数,因为无法确定其所属的实例对象。

    相关文章

      网友评论

          本文标题:C++中static用法总结(静态对象,内存)

          本文链接:https://www.haomeiwen.com/subject/bhrafhtx.html