前言
- 这一节主要讲四个默认成员函数、运算符重载,
- 复习this指针的用法
- 理解浅拷贝
一、什么是默认成员函数
- 默认成员函数,产生在类中,就有初始化、清理、拷贝的作用。
- 在类中,我们可以实现默认成员函数(自己写),那如果我们没有写这个函数,编译器也会自动实现,所以叫做默认成员函数
现在我们可以理解,如果一个类是空类,那么它也包含默认成员函数
二、构造函数
一个类实例化后,就应该对类进行初始化
C++提供的初始化函数叫做构造函数,类实例化后自动调用构造函数,完成初始化工作
1、无参构造函数
- 没有参数,那么在构造函数里面,我们就要对各个数据进行初始化
- 调用无参构造函数,就是类的实例化,因为创建时,构造函数自动调用
2、带参构造函数
- 构造函数可以重载,所以我们在写构造函数时,一般都对参数进行重载
- 在调用时,在实例化后要加上()
3、自动构造函数(一般不用)
在class中,没有写构造函数,那么编译器在实例化后将自动生成构造函数
生成的构造函数,初始化成随机值
如果类中有嵌套,并且嵌套的类有构造函数,那么会嵌套的类会调用自己写好的构造函数初始化
注意点:
- 一般而言,用带参构造函数,并且有重载
- 无返回值
三、析构函数
- 在对象生命周期结束时,自动调用,完成类的清理工作
1、定义
- ~+ __(类名)
- 无参数,无返回值
- 析构函数的调用,主要是防止内存泄漏,像栈、队列、链表等都要调用
但也有许多不需要写,由编译器自动产生即可
2、特性
- 一个类有且只有一个析构函数
- 类中有自定义成员,类也会调用自定义成员的析构函数
四、拷贝构造
用于对已创建好的类,进行拷贝,得出一个新类
1、 定义:
- 类名+(const 类名 & 变量) 参数要用引用接收,否则会造成无限递归
原因:1、要先开一块空间 2、开空间就要调用构造,再次调用拷贝构造,就一直递归下去
2、特性:
- 拷贝构造是构造函数的一个重载
- 这里蕴含this指针
- 不写拷贝构造函数,编译器会自动生成一个拷贝构造
将拷贝对象 一个字节一个字节的拷贝 这种方式是浅拷贝 。编译器产生的拷贝函数会满足绝大多数环境,但涉及动态内存、内存释放等就不适用
原因:动态内存一般存储指针,那么拷贝时,俩个数据指向同一块空间,一旦一个数据生命周期结束,内存就要释放,指针就要置空,同一块内存只能释放一次,所以程序会奔溃
五、赋值运算符重载
1、operator
对于内置类型,有运算操作 比如(+、-、*、=、==)等
自定义运算符就有运算符重载
定义:
- 返回值类型 operator 操作符 ( 参数关系)
- 形参看起来比实际操作数目少一个成员
原因:这里存在this指针 例如 s1=s2,那么参数是 (const 类名 形参名)代表s2,s1由this指针表示。
注意:
- 不能是其他运算符 如@
- 不能是 .* :: sizeof ? : . 等五种
2、赋值运算符
注意点:
- 返回类型
- 返回是*this
- 编译器会自动生成一个赋值运算,按字节拷贝
六、const成员
- const修饰类的函数成员,表示不能对函数的类成员进行任何修改
- 其中隐含this指针
一般而言,对于值不改变的对象,在函数定义或者生命末尾加上const
这里就涉及权限的放大和缩小,权限可以缩小,不能放大
思考以下题目:
- const对象可以调用非const成员函数吗? 不能,权限放大
- 非const对象可以调用const成员函数吗? 可以,权限缩小
- const成员函数内可以调用其它的非const成员函数吗? 不能,权限放大
- 非const成员函数可以调用其他的const成员函数吗? 可以,权限缩小
七、&运算符重载(了解)
这个运算符一般不需要写,编译器会自动生成,而在绝大情况下,都能适用。
总结:
这一节,主要讲几个成员函数的用法和特性
- 一般来说,构造函数必须有,析构,拷贝赋值在某些情况下可以用编译器的
- 浅拷贝就是编译器自动生成拷贝构造和operator= 按字节拷贝
————编程没有捷径。