类与对象(下章)

友元类与友元函数

一. 友元类是当前类的所有成员都可以是另一个类的友元函数,都可以访问另一个类的非公有成员。

在这里插入图片描述
由上图可知道,此时Date和Time就是友元类,此时Date可以调用Time的非公有成员。

1.友元关系是单向的,不具有交换性。比如上述的Time类和Date类,在Time类中声明Date类为其友元类,那么可以在Date类中直接访问Time类的私有成员变量,但想在Time类中访问Date类中私有的成员变量则不行。

2.友元关系是不具有传递性的
例如如果A是B的友元类,B是C的友元类,则不能说C是A的友元类。
结论:一般情况下不建议多使用友元,友元是一种破坏封装的行为,不到万不得已,不要使用友元。

再谈构造函数

一. 初始化列表
初始化列表:以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个成员变量后面跟一个放在括号中的初始值或表达式。

二.初始化列表一般的应用对象
1.const修饰的常量
2.引用变量
3.自定义类型成员(此时的自定义类是没有默认构造函数的)
如下图:
在这里插入图片描述
总结:尽量使用初始化列表,因为不管你是否使用初始化列表,对于自定义类型成员变量,一定会先使用初始化列表来初始化。
1.严格来说对于内置类型,其实使用初始化列表和函数体内初始化时没有差别的。
2.自定义类型,最好使用初始化。

三.explicit关键词
explicit的作用就是可以避免隐式类型转换如下:
在这里插入图片描述
如当前语句:A aa = 2;此语句是当类A中存在单参数的构造函数就支持这种隐式类型转换,此时这个语句在语法上是先构造一个临时变量并对其进行拷贝,此时编译器会先拿2构造一个临时的对象A之后将临时对象的值拷贝给对象aa。而当explicit修饰默认构造函数语句之后,就不能使用隐式类型转换,所以此时就不能使用上面的语句进行拷贝了。
成员变量在类中的生命次序就是在初始化列表中的初始化顺序,与其在初始化列表中的先后次序无关。

四.匿名对象
在这里插入图片描述
上面的语句是构造了一个匿名对象,这种语句的生命周期只有在这一行中,也就是在经过这一行之后就会立刻调用匿名对象的析构函数对其进行销毁。
在这里插入图片描述
当构造对象的时候可以直接调用对象中的成员函数,所以当要使用成员中的某些成员函数的时候,可以利用匿名对象来直接调用。

总结:
构造匿名对象的使用场景
如果定义一个对象要用,但是只是这一行用,其实地方都不用,先定义有名对象反而麻烦,所以此时直接定义匿名对象,方便快捷。

静态成员

在这里插入图片描述
一.定义成员变量
static int n;此时就可以创建一个静态变量,但是此时n不是被创建在函数的栈帧中的,而是创建在静态区,其生命周期是在全局的。

二.静态成员变量的初始化与特性
1.因为静态成员变量是被创建在静态区的,而不是创建在函数的栈帧上的,所以此时对静态成员变量的初始化是不随成员对象的创建而创建的,而是要在全局变量进行初始化的如下语句:
在这里插入图片描述
上面的语句是对域A使用::操作符来对静态变量进行初始化。

2.静态成员的特性
(1) 静态成员为所有类函数共享,不属于某个具体的对象,他是放在静态区的。
(2) 静态成员变量必须在类外进行定义,定义的时候不需要加static。
(3) 类静态对象即可用类名::静态成员或者对象静态成员来访问。
(4) 静态成员函数没有隐藏的this指针,不能访问任何非静态成员。
(5) 静态成员和类的普通成员一样,也有public,protected,private三种访问级别,也可以具有返回值。

具体如下:
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值