本节目标
一、类的6个默认成员函数
二、 构造函数
三、析构函数
四、拷贝构造函数
五、赋值运算符重载
六、const成员函数
七、取地址及const取地址操作符重载
一、类的6个默认成员函数
- 如果类里一个成员都没有,简称空类
- 空类中真的什么都没有吗?并不不是,任何类在什么都不写的情况下,编译器会自动生成6个默认成员函数
- 默认成员函数:用户没有显式实现,编译器自动生成的成员函数
二、构造函数
1.构造函数的概念
- 每个类成员变量都需要初始化
- 这是C语言时期的初始化,自己在类里写初始化函数
- 但是如果每个类对象在实例化完,都需要去调用初始化函数去进行初始化,就比较繁琐了
- 此时,能否在类对象创建时,就将数据初始化呢?
- 然后产生了构造函数
- 构造函数是一个特殊的成员函数,名字与类名相同,创建类对象时由编译器自动调用它
- 来保证每个数据成员都有一个自己的初始值,并且在类对象的整个声明周期只调用一次
2.构造函数的特性
- 构造函数是特殊的成员函数,虽然名字叫构造,但是其主要任务不是构造类,而是初始化对象
- 其特征如下
- 1.函数名与类名相同
- 2.无返回值
- 3.对象实例化时自动调用对于构造函数
- 4.构造函数可以重载(重载是后期知识)
- 构造函数分为无参和有参
- 为啥调用无参时不带括号呢,因为带了括号就变成函数声明了.......so you know
- 如果类中没有显式定义构造函数,则C++编译器会自动生成一个无参的默认构造函数,一旦 用户显式定义编译器将不再生成
- 关于编译器生成的默认成员函数,看起来好像没什么用,也没有对变量进行初始化,变量依旧是随机值
- 那这里的默认构造函数有啥用呢?
- 其实 C++把类型分为内置类型也就是(基本类型)和自定义类型,内置类型就是语言本身提供的数据类型,例如int char 等等,自定义类型就是我们使用class/struct/union等自己定义的类型
- 假设在一个类里面不仅定义了内置类型变量,还定义了一个自定义类型变量,如图
- 此Time 也是一个class类,用他来定义了一个类对象_t
- Time类如下图
- 此时我们在实例化Date类对象的时候,因为我们没写构造函数,所以编译器自动生成且调用了默认构造函数,此时虽然里面的_year _m....变量还是随机值,但是他还会去调用Time类的构造函数去对Time类实例化出的_t对象里的变量进行初始化
- 所以可以简单理解为,虽然默认构造函数不会对内置类型变量赋值,但是会对自定义类型也进行调用其构造函数,来初始化自定义类型对象
- 注意:C++11中针对内置类型不初始化的缺陷,又打了补丁:内置类型成员变量可以在类中声明时给默认值
- 无参的构造函数和全缺省的构造函数都称为默认构造函数,并且默认构造函数只有一个
- 我们没写 编译器默认生成的都可以认为是默认构造函数
- 简单的说 实例化类对象不需要传参的就是默认构造函数 需要传参的就叫普通构造函数
三、析构函数
1.析构函数的概念
- 析构函数跟构造函数完全相反,析构函数是销毁对象中的资源
- 但是不是完成对象本身的销毁,局部对象的销毁是编译器来完成的
- 在对象销毁时,会自动调用析构函数,完成对象中的资源清理工作
2.析构函数的特性
- 析构函数是特殊的成员函数,其特征如下
- 1.析构函数名 是在 类名前面加上~
- 2.析构函数无形参无返回值
- 3.一个类只能有一个析构函数,未显式定义,则编译器自动生成默认的
- 4.析构函数不能重载 只能有一个
- 5.对象生命周期结束后,C++编译器会自动调用析构函数
- 注意:如果类中没有申请资源时,可以不写析构,使用默认的即可,但如果有资源申请 例如mallolc或new 则一定要写,否则会导致内存资源泄露
四、拷贝构造函数
1.拷贝构造函数的概念
- 创建一个跟已存对象相同的新对象
- 只有一个形参,该形参是对类类型对象的引用(一般都加上const修饰)
- 编译器自动调用并创建好对象
2.拷贝构造函数的特征
- 是构造函数的重载形式
- 拷贝构造形参只有一个,必须是类类型对象的引用,使用传值编译器直接报错,因为会无穷递归拷贝构造下去
- 若未显式定义,编译器自动生成默认的
- 默认的拷贝构造函数对象按照内存拷贝方式完成拷贝,这种拷贝叫浅拷贝,也叫值拷贝,不太安全
- 、
- 虽然编译器自己生成的浅拷贝也能实现拷贝,但是如果是涉及到内存空间方面呢?
- 例如 拷贝出来的类对象 里面的指针变量 指向同一块区域,没有自己单独的区域
- 此时析构两个对象时,同一块空间被两次释放delete,编译器就会报错
- 所以我们还是要自己写拷贝,写深拷贝
五、赋值运算符重载
1.运算符重载
- C++为了代码的可读性 新增了 运算符重载,运算符重载是具有特殊函数名的函数
- 也具有返回值类型,函数名字以及参数列表
2.赋值运算符重载
- 参数类型:const T& 引用可以提高效率
- 返回值类型:T& 传引用返回可以提高效率,有返回值目的是为了连续赋值
- 检查自己是否要给自己赋值
- 返回*this
- 赋值运算符只能重载成类的成员函数,不能重载成全局函数
- 没显式写则系统默认生成,也是浅拷贝,面对涉及到内存资源时,我们还是要自己写
3.前置++和后置++重载
六、const成员函数
- 被const修饰的成员函数叫const成员函数
- 由于this指针是隐藏的,所以我们不用写实参,但是实参如果想加const呢
- 此时可以这样
七、取地址及const取地址操作符重载
- 用的很少,了解就行