static关键字

static:

在C中我们知道,static作为一个关键字,既能修饰变量,也能修饰函数

1.修饰变量

  • 若修饰局部变量,会改变他的生命周期,出了它现在所处的作用域,也不会被销毁,因为此时它已经不是存储在栈上,而是存在数据段上,数据段上的内容只有进程结束才会被销毁,但它的作用域不会被改变,还是处于当前作用域,该作用域之外不可见。

    注意:
    由于static局部变量的特性,使得含有静态局部变量的函数变得不可重入,每次调用会产生不同的结果,在多线程编程中是一种隐患,使用的话多加小心。

  • 若修饰全局变量,它也是存储在数据段上,生命周期和作用域未改变,有所改变的是其链接属性,全局变量原本是有默认的外部链接属性的,作用域是整个工程,在一个文件内定义的全局变量,在另一个文件中,通过extern 全局变量名的声明,就可以使用全局变量。加上static关键字后,只在定义它的源文件有效,在其他文件无法访问。

    static int g_a=0;//被初始化的静态全局变量系统会为其分配真正的空间
    static int g_b;//未被初始化的静态全局变量系统不会为其分配真正的空间

2.修饰函数
和修饰全局变量类似,只改变其链接属性。因此在不同的源文件我们可以使用同名的函数。

C++中:
主要说明static在类中的使用
很多情况下我们会将类中的成员声明为静态的,关于以下几点需要注意:

  • 静态成员在类中只有一份,被所有类对象共享,不属于某个具体的对象。
  • 静态成员变量需要在类中声明,在类外定义,定义时不用加static关键字。
  • 因为静态成员不是某个对象私有的,因此在访问时通过类域进行访问。(其实也可以通过对象来访问,只是在编译器在编译时都会转换成类域访问)
  • 若未定义类对象,我们是不能访问非静态成员函数的,但可访问静态成员函数
  • 静态成员函数和非静态成员函数的本质区别就是前者没有默认的this指针,而后者有。所以:
    在静态成员函数内部不能使用非静态成员(包括非静态成员变量和非静态成员函数),但在非静态成员函数中可以使用静态的成员变量。

  • 静态成员优先于对象存在,静态成员随类的加载就已经存在了

  • 在计算类大小时,不用将静态成员变量大小计算进去。
  • 和普通成员函数一样,静态成员也有三种访问级别private、protected、public。

静态成员与非静态成员的区别:

1.存储位置不同
静态成员存在数据区,属于该类的共享数据
非静态成员存在类对象的内存中,属于该对象的私有数据
2.生命周期不同
静态成员的生命周期随该类的加载
非静态成员的生命周期随该类的类对象
3.调用方式不同
静态成员可通过类名或类对象调用
非静态成员只能通过类对象调用

将类成员声明成静态还是非静态的应该看具体使用的场景,若我们要在成员函数中访问非静态成员就得声明成非静态的,要是不访问就能声明称静态的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值