学习笔记-关于static关键字(c++)

1. 隐藏(避免不同文件的函数和变量命名冲突)

static 用于修饰 全局变量 : 隐藏此全局变量,使得此全局变量仅限于本文件中使用
static 用于修饰函数 : 隐藏此函数,避免同名函数,本函数也仅限于本文件中使用

2.生命周期(对于变量来说必须在程序开始运行时进行初始化,不可改变)
1.如果作为static的局部变量可以在函数内定义,它的生存期为整个源程序,但是其作用域仍与自动变量相同,只能在定义该变量的函数内使用该变量。
2.退出该函数后, 尽管该变量还继续存在,但不能使用它。
3.static变量是默认初始化为0,其实全局变量也具备这一属性,因为全局变量也存储在静态数据区。在静态数据区,内存中所有的字节默认值都是0x00。

3.在类中定义(必须进行初始化)

static声明的变量和成员函数:
1.初始化时使用作用域运算符来标明它所属类;
2.静态数据成员是类的成员,而不是对象的成员;
3.对其取地址操作,变量地址是指向其数据类型的指针 ,函数地址类型是一个“nonmember函数指针”。
4.static并没有增加程序的时空开销,相反还缩短了子类对父类静态成员的访问 时间,节省了子类的内存空间。
static声明的成员函数:
1.没有this指针,仅能访问类的静态数据和静态成员函数;
2.不能被定义为虚函数;

4.初始化

静态成员初始化与一般数据成员初始化不同:
1.初始化在类体外进行,而前面不加static,以免与一般静态变量或对象相混淆;
2.初始化时不加该成员的访问权限控制符private,public等;
3.初始化时使用作用域运算符来标明它所属类;
所以我们得出静态数据成员初始化的格式:
<数据类型><类名>::<静态数据成员名>=<值>

ps:为了防止父类的影响,可以在子类定义一个与父类相同的静态变量,以屏蔽父类的影响。这里有一点需要注意:静态成员为父类和子类共享,重复定义了静态成员,我们的编译器采用了一种绝妙的手法:name-mangling 用以生成唯一的标志以避免错误。

以上文字部分摘录于以下地址:
https://www.cnblogs.com/songdanzju/p/7422380.html

关于static 在类中的使用问题,个人的学习心得如下

why use static?
1.用于实现在同一个类中,多个对象中共享数据,协调对象间的公用数据;
2.静态变量有着全局变量的优势,又不会被滥用,需要静态成员函数管理静态变量;
3.类的静态成员既属于类,也属于对象;

怎么用?

1.static 修饰数据成员需要进行初始化;
2.在类外进行初始化,类外不需要带 static 关键字;
3.类的声明和实现不在同一文件中时 ,在.cpp文件中进行初始化,避免多重定义(不能在.h文件进行定义函数和变量);
4.static 声明的数据成员,不占类对象的空间,不依赖于对象;
5.可以用<类名>::<静态数据成员名> 使用,受权限的控制;
6.static修饰函数,目的是为了管理静态变量,只能访问静态数据成员和静态成员函数,因为静态成员函数没有this指针;
7.非静态成员函数,是可以访问静态成员的。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值