4.static关键字和const关键字的作用【高频】

1. static 关键字

用static可以声明 静态变量,它存储在静态存储区中,它的生命周期 在整个程序运行期间 都存在。

  • 静态局部变量:

    • 参考之前

  • 静态全局变量:

    • 参考之前

  • 类中的静态成员

    在类中,被static声明的成员称为静态成员,包括 静态成员变量 和 静态成员函数:

    • 静态成员变量:

      • 该变量 属于这个类本身 而不是 某一个对象,所有的对象 共享这个变量

      • 在类内声明,在类外初始化

      • 和静态局部变量不一样,它的值是可以被多次赋值的

    • 静态成员函数:

      • 同理,表示所有对象 共享这个函数

      • 它内部可使用的变量也有限制:没有this指针,只能访问 静态成员变量

      • 静态成员函数的调用可以不通过创建 类的实例,而是直接通过 类名 调用

      • 它不能被声明为const、volatile和虚函数

  • 多线程

    • static变量 如果被 多线程 访问,需要特别注意 线程安全 问题

img

img

2. const关键字

  • 用const可以声明 常量变量,使变量不能被修改,且在定义时必须初始化

  • const形参可以接收const和非const实参

  • 类内:

    • const修饰成员变量:不能在类外初始化,必须在构造函数初始化列表中初始化。

    • const修饰成员函数:不能改变变量的值(除非用mutable修饰过)

    • const修饰对象:const对象只能调用const成员函数;非const对象都可以调用

  • 可以用于定义 常量指针指针常量

    • 常量指针 表示这个指针所指向的是一个常量。我们不能通过这个指针 来修改它所指向的值,但是指针本身的值,也就是 它所指向的地址 是可以改变的(const在*p之外)

      #include "stdio.h"
      void main(void)
      {
      	int const *p=NULL;//常量指针 //等效于 const int*p=NULL;
      	int a=10;
      	p=&a;//进行地址赋值
      	printf("%#x--%#x\r\n",p,&a);//打印地址值
      	printf("%d--%d\r\n",a,*p);//打印数据值
      } 
    • 指针常量 是指 指针本身是常量,也就是说 一旦被初始化,它所指向的地址 就不可更改了。但是 它所指向的数据是可以被修改的(const在*P之间)

      #include <stdio.h>
      int main(void)
      {
      	int a=10;
      	int *const p=&a;//初始化时赋值a的地址 //即int *(const p)=&a;
      	*p=20;
      	printf("%#x--%#x\r\n",p,&a);
      	printf("%d--%d\r\n",a,*p);
      }
    • 也可以同时使用 两个const关键字 来修饰 指针,使得它既是 常量指针,又是 指针常量,也就是 它所指向的数据 不能被修改,同时 它本身的值 也不能被修改

  • const也具有隐蔽性,被const修饰的变量不能被其他文件使用(链接都是内部的,所以其他文件也可以定义相同的名字的变量;而且头文件也可以包含const变量,但不能包含全局变量)

3. 有时候 static 和 const 可以组合使用,如 static const 变量,表示一个静态的常量

总之,static 用于 创建类的静态成员,const 用于 定义常量

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值