• 关于C/C++中,对static关键字的理解


    准备知识:C/C++的内存分布

    对于一个完整的程序,在内存中的分布情况如下:  
    1.栈区: 由编译器自动分配释放,像局部变量,函数参数,都是在栈区。会随着作用域退出而释放空间。
    2.堆区:程序员分配并释放的区域,像malloc(c),new(c++) 
    3.全局数据区(静态区):内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static 变量。程序结束释放。

    4.代码区

    在不同的语言环境、或者同一语言不同上下文环境中,static关键字具有不同的意思。

    1、C语言中

    1.1 声明为static的变量具有以下三部分特性:

     1)存储位置:存储于静态内存中

     2)创建与作用域:静态变量在程序运行之前创建,在程序的整个执行期间始终存在。

     3)初始化取值

    1.2 类型

    1.2.1 静态全局变量:

      1)内存中的位置:静态存储区(静态存储区在整个程序运行期间都存在)
      2)初始化:未经初始化的全局静态变量会被程序自动初始化为0(自动对象的值是任意的,除非他被显示初始化)
      3)作用域:全局静态变量在声明他的文件之外是不可见的,不能被其他文件所共享。准确地讲从定义之处开始到文件结尾。
    好处:
    定义全局静态变量的好处:
    <1>不会被其他文件所访问,修改
    <2>其他文件中可以使用相同名字的变量,不会发生冲突。

    1.2.2静态局部变量:

      1)内存中的位置:静态存储区
      2)初始化:未经初始化的全局静态变量会被程序自动初始化为0(自动对象的值是任意的,除非他被显示初始化)
      3)作用域:作用域仍为局部作用域,当定义它的函数或者语句块结束的时候,作用域随之结束。

    1.2.3 静态函数

      函数的定义和声明默认情况下是extern的,但静态函数只是在声明他的文件当中可见,不能被其他文件所用。
    定义静态函数的好处:
     1)其他文件中可以定义相同名字的函数,不会发生冲突
     2) 静态函数不能被其他文件所用。 

    2、C++中

    2.1静态数据成员

    在类内数据成员的声明前加上关键字static,该数据成员就是类内的静态数据成员.

    1)存储位置:静态数据成员存储在全局数据区

    2)初始化:在类体外进行初始化。<数据类型><类名>::<静态数据成员名>=<值> 

    3)静态数据成员被当作是类的成员。无论这个类的对象被定义了多少个,静态数据成员在程序中也只有一份拷贝,由该类型的所有对象共享访问。

    4)访问方式:<类对象名>.<静态数据成员名> 或 <类类型名>::<静态数据成员名>

    5)在没有产生类的实例时,也可以访问静态数据成员

    因为静态数据成员在全局数据区分配内存,属于本类的所有对象共享,所以,它不属于特定的类对象,在没有产生类对象时其作用域就可见,即在没有产生类的实例时,我们就可以操作它; 

    2.2静态成员函数

    特点:

    1)非静态成员函数可以任意地访问静态成员函数和静态数据成员; 
    2) 静态成员函数不能访问非静态成员函数和非静态数据成员; 

    3)由于没有this指针的额外开销,因此静态成员函数与类的全局函数相比速度上会有少许的增长; 
    4)调用静态成员函数,可以用成员访问操作符(.)和(->)为一个类的对象或指向类对象的指针调用静态成员函数,也可以直接使用如下格式:
    <类名>::<静态成员函数名>(<参数表>)

    5)出现在类体外的函数定义不能指定关键字static;

    只此一生,与子白头
  • 相关阅读:
    ASCII码对照表 And HTML字符实体
    操作系统自带命令查看文件的哈希
    HMAC简介及HMAC-SHA256实现Demo
    CSV文件注入漏洞简析
    Kubernetes集群的安全机制
    Kubernetes -- Horizontal Pod Autoscaler
    获取两坐标之间距离
    在CentOS 7中搭建Git服务器
    centos7 搭建svn服务器
    node.js依赖express解析post请求四种数据格式()
  • 原文地址:https://www.cnblogs.com/Miss-Bueno/p/7625462.html
Copyright © 2020-2023  润新知