137-C++学习第十弹(友元,静态,继承)

友元函数

1、单方向
2、不具有传递性
3、不具有继承特性

1.外部函数友元
在这里插入图片描述
作为外部函数,本身不具有this指针,需要创建对象传参
外部函数后不能加const
主函数也可以定义成友元函数
在这里插入图片描述
实际上在调动主函数之前还调动了其他函数
从内核加载
Windows支持多线程,线程是调度单位,进程是资源单位
Linux处于过渡阶段,两种调度单位,进程,线程

2.成员函数友元
在这里插入图片描述
解析如下
在这里插入图片描述
要把Object::fun的方法注册为Int类型的友元函数,访问Int产生的对象的私有和保护属性
必须告诉编译器是Object的成员函数
在这里插入图片描述
此函数的实现必须在Int类型之后!
在这里插入图片描述
3.类友元
在这里插入图片描述
Obj这个类型产生的对象可以去访问Int产生对象的公有私有和保护
友元不限于访问限定符的限制
没有公有友元私有友元保护友元
独自成为代码,不破坏访问限定符
在这里插入图片描述
在这里插入图片描述

静态成员

在这里插入图片描述
如果定义全局的num,有可能别人修改
在这里插入图片描述

如果再定义一个私有的num,也不行,数据成员变成两个,而创建obj对象只有一个数据,num不能被共享
在这里插入图片描述

如果想要这里的num只产生一份
在这里插入图片描述
在这里插入图片描述
num被所有对象共享
在这里插入图片描述
这个静态成员并不会纳入对象空间中
可访问性

在这里插入图片描述
一般把静态成员定义成私有和保护
如果声明成公有的话
可以在其他函数访问
在这里插入图片描述
可以以这两种方式访问
静态成员独自开辟到.data(数据区)
静态成员必须在外部实现
静态成员默认私有
在这里插入图片描述
在这里插入图片描述
子对象也共享静态成员num
在这里插入图片描述
在这里插入图片描述
静态函数
只能访问这个类型的静态成员
不能访问非静态成员
static修饰整个函数是静态函数
静态函数没有this指针,不能访问value
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
不能定义成常方法,因为没有this指针!!!
全局函数也不能定义成常方法
如果真的想访问value
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

继承

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
下面这两个占有的字节个数各是多少?
在这里插入图片描述
12 ,24
在这里插入图片描述
子对象含有隐藏的父对象
公有继承,父对象的可访问属性是公有的
私有继承,父对象的可访问属性是私有的
保护继承,父对象的可访问属性是保护的
继承方式决定这个对象的可访问属性
没有写可访问权限,class默认是私有的
struct来说默认公有

重点来了

下面这个情况,ABCD哪个不能编译通过?

公有继承

在这里插入图片描述
base有自己的ea eb ec 隐藏的obj对象(公有继承)
访问自己的私有保护公有天经地义
A可以编译通过
oa是隐藏对象的私有,不能访问
可以访问ob,oc
B这句代码不能编译通过
在继承中保护属性倾向于公有
可访问性。思想要转移到对象上,而不是类型
在这里插入图片描述
公有继承,可访问。直接访问自己的公有,隐藏父对象的公有。

如果是保护继承

主函数能不能编译通过?
在这里插入图片描述
可以编译通过
可以访问eb,隐藏的父对象是保护,也可以访问保护

下面这个1,2可以编译通过吗?
在这里插入图片描述
1可以编译通过(公有)
2不可以编译通过,主函数是外部函数,访问base,不能访问保护成员
外部函数不能访问保护成员
保护继承,隐藏父对象相当于保护属性,可以用base的成员方法访问保护属性
保护继承在对象,就是私有
在继承中可当做公有

如果是私有继承

下面这个可不可以编译通过?
在这里插入图片描述
可以编译通过
可以访问自己的私有,私有继承相当于私有属性,可以访问隐藏父对象的保护,公有
无论派生类型对象采取什么继承方式,都可以访问隐藏父对象的公有和保护
隐藏父对象的私有都不能访问

在这里插入图片描述
可以访问ec,不能访问oc,隐藏父对象是私有,不能在外部进行访问

最后一讲

在这里插入图片描述
一个是继承而来,一个是成员
不一样的
私有继承,可以访问隐藏父对象的保护和公有
成员对象只能访问oc,不能访问ob,只能访问成员对象的公有,不管在什么地方定义。
在这里插入图片描述
在这里插入图片描述
定义公有方法,访问私有属性

公有继承体现 是一个东西
一个人的类型
一个学生的类型
公有继承这个人
产生人这个对象
产生学生这个对象
学生是一个人。

只有公有继承才可以体现是一个
在这里插入图片描述
学生对象包含一个隐藏的父对象,学生是一个人
学生可以调动父对象的接口

父对象不能调动子对象的方法
人不是学生
学生是人 调动父对象

私有继承体现:由什么来组成

类型:发动机
类型:汽车
汽车私有继承发动机
不能说汽车是一个发动机
汽车是由发动机组成的
在这里插入图片描述
成员对象是一种组成概念
私有继承也是一种组成概念

对于java只有一种继承方式:公有。对现实部分描述
C++对现实的全部描述

比较复杂的继承关系

在这里插入图片描述
在这里插入图片描述
test有四个成员,tc,tb,ta,隐藏的父对象base
base有四个成员,ea,eb,ec,隐藏的父对象object
object有3个成员,oa,ob,oc
test的成员方法可以访问自己的公有,保护,私有,隐藏父对象的公有,保护,也可以访问隐藏父对象的隐藏父对象的公有,保护

如果是私有继承object
在这里插入图片描述
test里的方法
可以去访问tc,tb,ta,
隐藏的父对象base
公有
可以访问ec,eb,不能访问ea
私有继承,不可以访问obj对象

如果是这种情况呢?
在这里插入图片描述
test的成员方法
可以访问自己的公有私有保护
ec,eb可以访问
oc,ob也可以访问
公有继承相当于公有属性

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林林林ZEYU

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值