• 从c到cpp对static 关键字的总结 需要整理下!!!!!!!!!!!!!!!!!!!!!!


    一个完整的程序,在内存中的分布情况如下:  具体分布图     自己看书去!!!!!
    1.栈区: 由编译器自动分配释放,像局部变量,函数参数,都是在栈区。会随着作用于退出而释放空间。
    3.堆区:程序员分配并释放的区域,像malloc(c),new(c++) 
    3.全局数据区(静态区):全局变量和静态便令的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束释放。
    4.代码区

    C 语言的 static 关键字有三种(具体来说是两种)用途:

    1. 静态局部变量:用于函数体内部修饰变量,这种变量的生存期长于该函数。

    2. 静态全局变量:定义在函数体外,用于修饰全局变量,表示该变量只在本文件可见。

    3. 静态函数:静态函数跟静态全局变量的作用类似:
                          一. 静态函数不能被其它文件所用;
                          二. 其它文件中可以定义相同名字的函数,不会发生冲突;

    ==========================================================================

    :在C语言中,static主要定义全局静态变量,定义局部静态变量,定义静态函数

     一、       定义全局静态变量 :在全局变量前面加上关键字static,该全局变量变成了全局静态变量。全局静态变量有以下特点:

    (1)       在全局数据区内分配内存

    (2)       如果没有初始化,其默认值为0

    (3)       该变量在本文件内从定义开始到文件结束可见

     二、       定义局部静态变量:在局部静态变量前面加上关键字static,该局部变量便成了静态局部变量。静态局部变量有以下特点:

    (1)       该变量在全局数据区分配内存

    (2)       如果不显示初始化,那么将被隐式初始化为0

    (3)       它始终驻留在全局数据区,直到程序运行结束

    (4)       其作用域为局部作用域,当定义它的函数或语句块结束时,其作用域随之结束。

      三、       定义静态函数:在函数的返回类型加上static关键字,函数即被定义成静态函数。静态函数有以下特点:

    (1)       静态函数只能在本源文件中使用

    (2)       在文件作用域中声明的inline函数默认为static

                    说明:静态函数只是一个普通的全局函数,只不过受static限制,他只能在文件所在的编译单位内使用,不能够在其他编译单位内使用。

    C++对static的扩展
    1)在类中的static修饰的成员变量属于类可以共享,相当于全局变量,不属于具体的某个实例或者对象,也就是说当某个类的实例修改了该静态成员变量,其修改值为该类的其它所有实例所见,还有必须在类外初始化,static成员变量访问形式:1°可以被对象访问 2° 可以被类访问 3°可以被对象指针访问
    2)普通函数有this指针,指针可访问所有成员,但在类中的static成员函数属于整个类所拥有,这个函数不接收this指针,所以只能访问类的static成员变量。static只能在声明函数时加,不能再定义时候加(类中声明,类外初始化)

    在C++语言中新增了两种作用:定义静态数据成员或静态函数成员

    (1)       定义静态数据成员。静态数据成员有如下特点:

    (1)       内存分配:在程序的全局数据区分配

    (2)       初始化和定义:静态数据成员定义时要分配空间,所以不能在类声明中定义

    (3)       静态成员函数。静态成员函数与类相联系,不与类的对象相联系。静态成员函数不能访问非静态数据成员。原因很简单,非静态数据成员属于特定的类实例,主要用于对静态数据成员的操作。

    (4)       静态成员函数和静态数据成员都没有this指针。

    1.静态成员之间可以相互访问,包括静态成员函数访问静态数据成员和访问静态成员函数;
    2.非静态成员函数可以任意地访问静态成员函数和静态数据成员;
    3.静态成员函数不能访问非静态成员函数和非静态数据成员;
    4.调用静态成员函数,可以用成员访问操作符(.)和(->)为一个类的对象或指向类对象的指针调用静态成员函数,也可以用类名::函数名调用(因为他本来就是属于类的,用类名调用很正常)
    ---------------------

     1 static修饰的变量先于对象存在,所以static修饰的变量要在类外初始化。因为static是所有对象共享的东西嘛,必须要比对象先存在的。

     2 用static修饰的成员变量在对象中是不占内存的,因为他不是跟对象一起在堆或者栈中生成,用static修饰的变量在静态存储区生成的,所以用static修饰一方面的好处是可以节省对象的内存空间。

    3  由于static修饰的类成员属于类,不属于对象,因此static类成员函数是没有this指针的,this指针是指向本对象的指针。正因为没有this指针,所以static类成员函数 不能访问非static的类成员,只能访问 static修饰的类成员。

  • 相关阅读:
    Nginx安装
    win卸载输入法之后,在系统设置的键盘中还有这个输入法
    为Delphi 10.4.2实现android拍照填坑
    图文解说 ChinaCock 华为扫描
    Delphi Event Bus进阶(二)GlobalEventBus是怎么来的?
    小心SecondsBetween有坑
    Delphi Event Bus进阶(一)控制订阅方法的线程模式
    Delphi 10.4.2试用报告
    Delphi Event Bus入门
    UML建模——活动图(Activity Diagram)
  • 原文地址:https://www.cnblogs.com/zhangkele/p/9834039.html
Copyright © 2020-2023  润新知