c++中static静态与const常量的总结——三丰云

1.const
const是c++中的常类型修饰符,常类型的变量是不可修改的。
const常量与宏define的区别:define是没有定义数据类型,const是有数据类型的。编译器在对const进行类型安全检查的时候可以发现不匹配的数据类型传值。而define只是进行字符的替换,没有进行安全检查,所以define在进行字符替换的时候或许会产生意料之外的错误。
且const可以节省内存空间,const只是给出了对应的内存地址,而define是给出立即数。const定义的常量在程序运行过程中只有一份拷贝,而define定义的常量在内存中有若干的拷贝。

cosnt可以防止数据被意外修改,可以增强程序的健壮性。

1.当const修饰常量如: const int max =100与int const max =100;是一样的。

2.当const修饰指针有三种形式。
const char* max ; const放在最左边表示指针所指向的地址本身的值是不能改变的,强调的是哪个被指的地址。
char* const max; const放在*后面表示指针的内容不能变,即为指针指向初始化的地址后,就不能再修改指向其他地址。强调的是指针变量的地址空间。
const char *const max; 第三种是两种的结合,指针不能指向其他地址,且指向的地址的值也不能再改变。

3.const修饰成员函数。
int show(int x)const; const表示成员函数是类的常成员,它能防止成员变量被修改。当使用const修饰成员函数时,可以防止成员函数修改成员变量的值,同时常成员函数不能调用任何非常成员(const)的函数。(但是为了保证成员变量不被修改,使用const修饰成员变量才是稳定的选择)。const修饰成员函数的最大作用就是限制常量对象的使用。
const修饰的函数可以读取所以的成员变量,但不能对其企图修改。

4.const与类相关的
const修饰成员变量表示为常成员,不能被修改且只能在初始化列表中被赋值。
const修饰成员函数以经讲过。
const修饰类对象、对象指针、对象引用时。那么对象为常量对象,常量对象不能调用任何非const的成员函数,从而保证了不修改成员变量的值。(因为任何非const函数都有修改成员变量的企图)。常量对象的数据成员不能被修改且要有初始值。

另外提一笔,c++关键字mutable是为了突破const关键字的限制而存在的,当一个变量被mutable修饰,那么它被定义为永远可变。这会和const关键字的性质起到冲突吗?const关键字修饰函数的意思是这个函数不修改任何对象内部状态。而mutable关键字修饰数据成员变量表示这个成员变量不属于对象内部状态。

什么时候使用mutable关键字?我们为了使得类的成员函数不去修改类的数据成员变量,用const修饰成员函数,但是,这会将所有的成员变量的修改一棍子打死全部不可在此函数中修改。我们是为了保护一些特定的数据成员变量,如银行类中的用户存款值,用户信息等。但是比如用户数目,这些就没有那么重要,所有这个数据就用mutable来修饰。
mutable不能修饰static类型,因为static静态就是被共享的,是可以被大家使用的。

如下:
不使用mutable在const函数中企图修改数据成员变量,在编译时报错
错误:

修改后:
修改后就不会出现错误

以上仅做学习例子。

2.static
如果一个数据成员被static修饰,那么则称这种数据成员为静态数据成员,与一般的静态数据成员不同,无论建立多少个类对象,都只有一个静态数据成员的拷贝。从而实现同一个类对不同对象间的数据共享。
定义方式:static 数据类型 数据成员名。
1.静态数据成员在类中声明,但是要在类外定义。
局部静态变量
全局变量与静态变量的存储是放在一起的,初始化的全局变量与静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域,程序结束释放。那么静态数据是在全局数据区域分配的空间,它的存在是什么意义呢?它的存在意义是随着第一次函数的调用而初始化,但是却不随着函数的调用结束而销毁。
那么局部静态变量和全局变量有什么区别呢?区别在于使用全局变量,变量就不属于函数本身,且不再收到函数的控制了,给维护带来不便。
所以局部静态变量的特点为:
(1.)局部静态变量是在全局数据区分配内存的(局部变量是在栈区分配内存)。
(2.)局部静态变量在程序执行到该对象时该对象被首次初始化,以后函数再调用就不在进行初始化(局部变量每次函数调用结束后就被销毁,再次使用需要再次初始化)。
(3.)局部变量一般在声明处初始化,且若没有显式初始化,则程序会自动初始化为0(局部变量不会自动初始化为0)。
(4.)静态局部变量一直存驻留在全局数据区,知道程序运行结束。(局部静态变量要注意局部二字,它虽然在全局数据区分配空间,但是在函数体外是不可见的,局部静态变量只能在函数体内使用)。

全局静态变量
全局静态变量定义在函数外。它的使用和全局变量没有太大区别,但是静态函数只能访问静态变量而不能访问非静态变量。
区别在于对文件方面的处理,之后复述。

在类中
静态成员变量
在类中静态成员变量在编译时创建并初始化,它是属于类的,被叫做类变量,准确来说是属于类中对象的集合。它在任何对象创建前就存在了,可以通过:类名::静态数据成员名,访问。静态成员变量在类中声明(static 数据类型 数据名;),在类外定义,定义的时候格式为:(数据类型 类名::数据名 = 初始化值),声明时带static,定义时不带,不显式声明也有一个为0的初值。
总结:非静态成员每个类对象都有自己的拷贝。但是静态数据成员被当做是类的成员,由该类的所有对象共享,对所有对象来说静态数据成员只分配一次内存。静态数据成员存储在全局数据区,且静态数据成员定义是要分配空间的,所以不能在类里面定义。(每生成一个对象不需要单独给对象分配一次数据空间)。

静态成员函数
1.静态数据成员之间可以相互访问,包括静态成员函数访问静态数据成员和访问静态成员函数。
2.非静态成员函数可以任意访问静态成员函数和静态数据成员。
3.静态成员函数不能访问非静态成员函数和非静态数据成员。这是因为所有的非静态数据成员都是属于对象的,非静态成员函数的使用也是需要对象来调用的,但是静态成员函数是属于类的,它并不知道关于对象的信息。(每个非静态成员函数都有一个隐式的this指针,但是静态成员函数没有这个this指针,所以静态成员函数在使用时不知道指向那个对象,而所有非静态数据成员又是对象拥有的,所以静态成员函数不能调用非静态数据成员和非静态成员函数)。

非静态成员函数是可以调用静态成员函数和静态数据成员的,因为对象由类实例化而来,所以对类十分了解。

4.调用静态成员函数,可以用(->)和(.)为一个类的对象或指向类对象的指针调用静态成员函数,也可以直接使用(类名::函数名)调用(这是因为静态成员函数是直接属于类的函数,可以直接用类调用)。

仅做个人学习记录,错误点欢迎提出!
————————————————
版权声明:本文为CSDN博主「一二熊猫」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zjlzjlpy/article/details/125022074

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值