前言
本节主要讲解有关类与对象的有关技术。主要包含有以下内容:this指针、友元与内部类、静态成员、匿名对象、常函数与常对象。
this指针
同一个类创建的对象通常公用同一份成员函数,为了区分调用该成员函数的分别对应哪些对象,C++引入this指针来解决这一问题,即this指针是指向调用该成员函数的对象。
this指针的特点:this指针无需定义,是隐含在非静态成员函数中的,可直接使用,且this指针无法修改指向。
this指针的作用:指向调用该成员函数的对象。
1.当该成员函数的参数与该属性名称冲突时,默认使用的是参数的名称,利用this指针能区分重名冲突.
2.当需要返回调用该成员函数的对象时,可以使用return *this;一般用于链式访问.
友元
当类内的某些私有属性或者受到保护的属性,想要在类外被其他语句使用就需要利用到友元技术来为类外的语句扩大访问权限。
友元技术的三种实现:
1.全局函数作友元
利用全局函数来访问类中的私有属性或受保护的属性
2.友元类
友元类是通过一个类来访问另一个类的私有属性或者受保护的一种方式。
友元类分以下几种情况:
即主要是3种情况:独立友元关系、内部类的友元关系和非内部类的友元关系
非独立类的友元关系
注意,在内部类的友元关系中,外部类默认是内部类的友元。有关内部类的细节内容可以查看我之前发过的这篇文章-内部类与类创建的成员属性。
3.成员函数作友元
利用成员函数来访问类中的私有或者受保护的属性。
可能很多人在测试成员函数作友元的时候明明觉得代码执行逻辑没有问题,但却始终都是报错,程序也运行不起来。在此我给一份当初测试的错误代码大家,大家可以分析一下我为什么错了。
以下是上面成员函数作友元的错误版本
大家可以先不看注释来试着读一下这个代码的执行逻辑,其实不难看出这个执行逻辑是很乱的。Info虽然前置声明了,但还没定义所以这个友元声明不成立,因此Info类中是无法正常访问m_age的。
由此可得出上面的三点结论:
结论:
1、友元关系成效范围是声明及以下
2、类内的成员函数尽量在类外下方实现
3、类的使用需要计算成员属性占用内存空间的大小
静态成员
在C语言阶段我们学过static关键字,被static修饰后的变量称为静态变量,被static修饰的函数称为静态函数。C语言中static的作用如下:
1.static修饰局部变量:局部变量的生命周期变长,作用域扩大到全局。
2.static修饰全局变量:全局变量的生命周期变短,作用域缩小至该文件,无法在外部文件中被调用。
3.static修饰全局函数:作用与修饰全局变量相同,无法被外部文件调用,仅限当前文件使用。
在C++中,除了继承了上述的作用外,static还增加了对类内成员的作用。被static修饰的成员变量称为静态成员变量,同理,另一个为静态成员函数。静态成员主要有以下特点:
静态成员变量
1.所有对象共享同一份数据;
2.程序编译时分配空间;
3.类内声明,类外初始化;
4.访问方式有两种:a.通过对象访问 b.通过类名(作用域)访问
静态成员函数
1.类内声明,类外实现;
2.函数实现内部只能访问静态成员函数;
3.不依赖于任何对象。
总结:静态成员和非静态成员的区别主要体现在访问方式上,静态成员有两种访问方式分别是通过对象和类名,非静态成员只能通过对象来访问。另外,值得一提的是非静态成员函数和静态成员函数的区别主要是静态成员函数只能访问静态变量。
补充讲解:匿名对象
匿名对象的生命周期只有一行,执行完后系统自动回收匿名对象的空间。
匿名对象的创建与使用
常函数和常对象
注意:常函数特指成员函数
C语言中曾出现过const这个关键字,曾经const主要作用有修饰变量、修饰指针、修饰函数参数、修饰函数返回值。C++继承了C语言中const的用法,另外C++也对其用法作了扩展,如:const修饰引用、const修饰成员函数、const修饰类对象等,本主题主要讲解后两个,其中const修饰引用在C++与C的衔接这篇文章中曾有讲过。
常函数
1.成员函数后加const后,该函数被称为常函数;
2.常函数内不可修改成员属性;
3.成员函数声明时加上关键字mutable后,在常函数中也可以修改该属性。
常对象