const 和 static

本文详细解析了C/C++编程语言中的static与const关键字的作用。static关键字可以改变变量的生命周期和作用域,也可用于限制函数的可见范围。const关键字则用于定义只读变量,确保变量在程序运行过程中不可被修改。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

static作用:“改变生命周期” 或者 “改变作用域”

  程序的局部变量存在于(堆栈)中,全局变量存在于(静态区 )中,动态申请数据存在于( 堆)中。

1.作用于变量:

   用static声明局部变量-------局部变量指在代码块{}内部定义的变量,只在代码块内部有效(作用域),其缺省的存储方式是自动变量或说是动态存储的,即指令执行到变量定义处时才给变量分配存储单元,跳出代码块时释放内存单元(生命期)。用static声明局部变量时,则改变变量的存储方式(生命期),使变量成为静态的局部变量,即编译时就为变量分配内存,直到程序退出才释放存储单元。这样,使得该局部变量有记忆功能,可以记忆上次的数据,不过由于仍是局部变量,因而只能在代码块内部使用(作用域不变)。

   用static声明外部变量-------外部变量指在所有代码块{}之外定义的变量,它缺省为静态变量,编译时分配内存,程序结束时释放内存单元。同时其作用域很广,整个文件都有效甚至别的文件也能引用它。为了限制某些外部变量的作用域,使其只在本文件中有效,而不能被其他文件引用,可以用static关键字对其作出声明。

  总结:用static声明局部变量,使其变为静态存储方式(静态数据区),作用域不变;用static声明外部变量,其本身就是静态变量,这只会改变其连接方式,使其只在本文件内部有效,而其他文件不可连接或引用该变量。

2.作用于函数:

  使用static用于函数定义时,对函数的连接方式产生影响,使得函数只在本文件内部有效,对其他文件是不可见的。这样的函数又叫作静态函数。使用静态函数的好处是,不用担心与其他文件的同名函数产生干扰,另外也是对函数本身的一种保护机制。

  如果想要其他文件可以引用本地函数,则要在函数定义时使用关键字extern,表示该函数是外部函数,可供其他文件调用。另外在要引用别的文件中定义的外部函数的文件中,使用extern声明要用的外部函数即可。

 

const作用: “只读(readonly)”


   const用来定义常量,不能作为左值被修改,而且必须初始化。

   const常量的初始值如果是一个明确的值,那么常量会在编译的时候被初始值替换

  

  const修饰指针时,如果在*右边,则指针本身不可改变,指针所指内容可以改变;如果在*左边,表示指针所指内容不可变,指针本身可改变

const和非const类型转化的问题。  char *可以赋值给const char*,而const char *不能赋值给char *,因为会存在修改常量内存块的风险。

    比如 char *p2 = const char *p1   p1原来指针指向的内容为常量不能被修改,通过赋值之后,可以通过*p2来修改常量内存。编译器是不允许的。


const成员变量对于某个对象是常量,而对于整个类是变量,因为同一个类可以有多个对象,他们的const值可以不同。所以const修饰类的成员变量时,不能在类定义中初始化,因为对象没有被创建时,编译器不知道const数据成员的值是什么。只能在类的构造函数中的初始化列表进行初始化, 并且必须要有构造函数。要想创建整个类都恒定的常量,用类中的枚举常量来实现,或者用static const

一般在修饰函数形参,使得该形参在函数中不允许被改变。

对于类的成员函数,有时候必须指定其为const类型,表明他是一个常函数,不能修改类的成员变量。常对象只能调用常方法,普通对象可以调用常方法和普通方法。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值