【C++学习笔记】类中的静态成员及其深度解析

18 篇文章 6 订阅
8 篇文章 1 订阅

为什么要设置静态成员?

有时候一个类的不同对象对于个别数据需要共享,也就是不同对象大家需要一起改变某一个成员,这时,就要求这个被改变的数据成员是固定的(即该类的所有对象用的是同一个拷贝),并且是每一个对象所共有的,这时就用到了静态成员。

静态数据成员

静态数据成员的声明:
静态成员的声明和静态变量的声明一样,用关键字static即可声明。
但是静态数据成员必须在类外进行定义和初始化,用::来指明所属的类。(声明是不分配内存的,定义才会分配内存)

class Human{
private:
	static bool love=true;//这个是错误的写法
};

在这里插入图片描述

正确写法是:

class Human{
    private:
    	static bool love;
    };
bool Human:: love = true;//这里要注意哦,在类外定义时是不加static的,

注意在类外初始化不能加static!在这里插入图片描述

初始化的位置一般在类定义之后,main()之前。

静态数据成员的访问
在静态数据成员为公有成员的情况下,其有两种方式进行访问:

  • 可用类名访问:类名::静态数据成员
  • 也可以用对象访问:对象名.静态数据成员或对象指针->静态数据成员

私有静态数据成员不能被类外部函数访问,也不能用对象进行访问。

静态成员函数

静态成员函数的声明和调用和静态数据是类似的,我们这里就不做赘述了,接下来我们看看静态成员函数与普通成员函数的不同点。

  1. 静态成员函数为该类所有对象所共有,共同编辑,公有静态成员函数的调用可以通过类名和对象名来调用,但是一般公有成员函数只能通过对象名调用。
  2. 静态成员函数没有this指针。
  3. 静态成员函数可以直接访问该类的静态数据成员和函数成员,但是由于没有this指针,静态成员函数访问非静态数据成员时,必须通过参数传递的方式得到对象名,然后通过对象名访问。
  4. 静态函数不能是友元函数也不能是虚函数,也不可以是析构函数也不可以是构造函数。
  5. 静态函数不能被重构,无法实现多态性。

静态成员与动态成员的空间关系

静态成员变量本质上是全局变量。一个类,在定义出静态变量的那一刻起,静态变量就已经存在了,哪怕是该类一个对象都没有。
关于静态成员与动态成员的空间关系我做出这样的解释

类是抽象的概念,只有在定义一个具体的对象后才会有实例化,才会具体的分配内存,这时类内的数据成员放在动态储存区,类内的成员函数放在
方法区,而方法区的成员函数通过this指针来与类的数据成员形成联系,从而实现对数据成员的直接操作。但是这一切的前提是先有类的实例也就是对象。

在这里插入图片描述
但是static要求数据成员归大家公有,甚至没有对象时也要有相应的备份。那怎么办呢?

所以static静态成员选择在定义对象前就先把数据成员和成员函数全部定义在静态区里。

在这里插入图片描述

这时,由于没有对象建立,所以也就没有this指针,所以也别提和一般的数据成员建立联系了,因为这时动态区的数据成员还没建立呢。而static数据成员由于和static函数在同一个区,所以可以直接使用。这就是为什么静态数据成员没有this指针以及无法直接访问非静态成员的原因。

而静态成员由于在动态区有了声明,从而使得处在静态区的静态成员、处在动态区的类的对象的数据成员以及对象的成员函数三者连接成了一个整体!
在这里插入图片描述

我们可以这样想:对象的定义实际上是建立一个“司令部”,里面有构造函数和各种成员的声明。

由于有构造函数,司令部可以在动态区和方法区创建各种成员。

由于有声明,司令部可以调配对象内分别储存在不同区的所有资源,即在动态区的普通数据成员、在方法区的函数成员、在静态区的静态数据成员和静态成员函数。也让在不同区的成员连成一个整体

方法区内的函数拥有来自司令部的“金牌”——this指针,通过this指针,成员函数可以直接和司令部通信,通过司令部调用类内各种成员。

静态区的数据成员由于是在司令部成立之除创建的,所以没有这张金牌,所以静态成员函数没有this指针也不能直接与非静态成员建立联系,只能直接与静态区的数据建立联系。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值