Bootstrap

【C++】入门【三】

本节目标


一、类的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取地址操作符重载

  • 用的很少,了解就行

;