类的六个默认成员函数
构造函数
类的特殊成员函数,函数名和类名相同,无返回值,在创建对象期间,由编译器自动调用,完成对象的初始化工作,并在整个对象的生命周期只调用一次。
构造函数的特性
- 无返回值
- 可以重载
- 用户没有显示调用,编译器会自动调用一个默认的构造函数
- 不能用const,virtual,static修饰
- 具有初始化列表
- 只有构造函数才具有初始化列表,
- 只能在初始化列表中非静态成员
- 类成员变量在初始化列表中只能初始化一次
- 初始化顺序与类成员列表中顺序相同
- 避免成员初始化成员
必须在初始化列表中初始化的成员 - const类型成员变量,因为常量只能初始,不能赋值,所以只能在初始化列表中初始化
- 引用类型成员变量,引用必须在定义时初始化,不能赋值,所以也要在初始化列表中进行初始化
调用场景
创建新对象时
为什么构造函数不能是virtual的?
对象在没实例化之前没有内存空间,找不到虚函数表;
虚函数在于通过父类指针或引用调用它时会调用子类的那个成员函数,而构造函数时创建对象时自动调用的,不可能通过父类指针调用
拷贝构造函数
是特殊的构造函数
特性
- 单参,参数必须是类类型对象的引用
- 用户不显示定义,编译器会在编译期间调用默认的拷贝构造函数,如果涉及到资源管理,则需要用户自己显示定义一个拷贝构造函数
调用场景 - 用类类型对象创建新对象时,
- 以类类型对象作为形参
- 以类类型对象作为函数返回值
析构函数
特殊成员函数,在对象销毁时,清理对象中资源,由编译器自动调用
注意
只是清理对象中管理的资源,并不会回收对象空间,对象如果是堆上的,对象空间由delete和delete[]回收
特性
- 无参
- 不能重载
赋值重载函数
作用
提高代码可读性
常见运算符重载
前置++,后置++,前置–,后置–,const,[],*,->
类的封装
什么是封装?
将一个事物的内部的实现细节包装起来,只给外界提供操作的接口
c++如何进行封装?
c++通过类的方式将对象进行封装,通过访问限定符来控制有哪些接口能够提供给外界使用
面向对象和面向过程区别?
向对象方法中,把数据和数据操作放在一起,组成对象;对同类的对象抽 象出其共性组成类;类通过简单的接口与外界发生联系,对象和对象之间通过消 息进行通信。
而面向过程方法是以过程为中心的开发方法,它自顶向下顺序进行, 程序结构按照功能划分成若干个基本模块,这些模块形成树状结构
类的实例化
类,通过创建对象来进行实例化,类中封装了描述该对象的方法和属性,而对象,则是类创建出的实体
类的大小?
类大小为类中非静态成员变量的大小
空类
一个空类的大小为1
原因:为了每个实例在内存中都能有独一无二的地址
this指针
类的非静态成员函数的第一个隐藏的参数,指向调用当前函数的对象
特性
- 类类型,T*const
- 隐藏
- 用户在编写不给出this参数,编译器自己维护,也不用手动传递,this指针传参也是编译器自己进行
- 只存在于正在运行的成员函数中,不会存在于对象中,不影响对象大小
this指针的传递
1.exc寄存器
2.参数压栈
this指针是否可以为空
如果成员函数通过类类型对象方式调用this指针,则一定不能为空
如果通过类类型指针调用,this指针则可能为空
this指针什么时候创建?
在类的成员函数开始执行前构造,在成员执行结束后清除
类的非静态成员函数的第一个隐藏的参数,指向调用当前函数的对象。