C++程序设计第五章

学堂在线C++程序设计第五章学习笔记

类与对象

对象:现实中对象的模拟,具有属性和行为。
类:同一类对象的共同属性和行为

定义对象时:通过构造函数初始化
删除对象时:通过析构函数释放资源

面向对象程序的基本特点

抽象:对同一类对象的共同属性和行为进行概括,形成类

封装:将抽象出的数据,代码封装在一起,形成类

继承:在已有类的基础上,进行扩展形成新的类

多态:同一名称,不同的功能实现方式

类和对象

设计类就是设计类型

  • 此类型的“合法值”是什么
  • 此类型应该有什么样的函数和操作符
  • 新类型的对象该如何被创建和销毁
  • 如何进行对象的初始化和赋值
  • 对象作为函数的参数如何以值传递
  • 谁将使用此类型的对象成员

类定义的语法形式

class 类名称
{
    public:
        公有成员(外部接口)
    private:
        私有成员
    protected:
        保护型成员
}

类的成员函数

  • 在类中声明函数原型
  • 可以在类外给出函数体实现,并在函数名前使用类名加以限定
  • 也可以直接在类中给出函数体,形成内联成员函数
  • 允许声明重载函数和带默认参数值得函数

构造函数

类中的特殊函数
用于描述初始化算法

作用:

  • 在对象被创建时使用特定的值构造对象,将对象初始化为一个特定的初始状态

形式:

  • 函数名与类名相同
  • 不能定义返回值类型,也不能有return语句
  • 可以有形式参数,也可以没有形式参数
  • 可以是内联函数
  • 可以重载
  • 可以带默认参数值

调用时机

  • 在对象创建时被自动调用
  • 例如:
    Clock myClock(0,0,0)

默认构造函数

  • 调用时可以不需要实参的构造函数
    • 参数表为空的构造函数
    • 全部参数都有默认值的构造函数

隐含生成的构造函数

  • 如果程序中未定义构造函数,编译器将自动生成一个默认构造函数
  • 参数列表为空,不为数据成员设置初始值
  • 如果类内定义了成员的初始值,则使用内类定义的初始值
  • 如果没有定义类内的初始值,则以默认方式初始化
  • 基本类型的数据默认初始化的值是不确定的

复制构造函数

  • 复制构造函数是一种特殊的构造函数,其形参为本类的对象引用。作用是用一个已存在的对象去初始化同类型的新对象。
class 类名{
    public:
        类名(const 类名 &对象名); //复制构造函数
}

类名::类(const 类名 &对象名) {
    函数体
}

复制构造函数被调用的三种情况

  • 定义一个对象时,以本类另一个对象作为初始值,发生复制构造
  • 如果函数的形参是类的对象,调用函数时,将使用实参对象初始化形参对象,发生复制构造
  • 如果函数的返回值是类的对象,函数执行完成返回主调函数时,将使用return语句中的对象初始化一个临时无名对象,传递给主调函数,此时发生复制构造

隐含的复制改造函数

  • 如果没有为类声明拷贝初始化构造函数,则编译器自己生成一个隐含的复制构造函数
  • 这个构造函数执行的功能是:用初始值对象的每个数据成员,初始化将要建立的对象的对应数据成员

析构函数

  • 完成对象被删除前的一些清理工作。
  • 在对象的生存期结束的时刻系统自动调用它,然后再释放此对象所属的空间。
  • 如果程序中未声明析构函数,编译器将自动产生一个默认的析构函数,其函数体为空。
  • 析构函数的原型:~类名()
  • 析构函数没有参数,没有返回类型

类的组合

  • 类中的成员是另一个类的对象
  • 可以在已有抽象的基础上实现更复杂的抽象

类组合的构造函数设计

  • 原则:不仅要对本类中的基本类型成员数据初始化,也要对对象成员初始化
  • 声明形式:
类名::类名(对象成员所需的形参,本类成员的形参):
对象1(参数),对象2(参数),...
{
    //函数体
}

构造组合类对象时的初始化次序

  • 首先对构造函数初始化列表中列出的成员(包括基本类型和对象成员)进行初始化,初始化次序是成员在类体中定义的次序
    • 成员对象构造函数调用顺序:按对象成员的定义顺序,先声明者先构造
    • 初始化列表中未出现的成员对象,调用默认构造函数(即无形参)的初始化
  • 处理完初始化列表后,再执行构造函数的函数体

结构体

结构体是一种特殊形态的类
与类的唯一区别

  • 类的缺省访问权限是private
  • 结构体的缺省访问权限是public

什么时候用结构体

  • 定义主要用来保存数据,而没有什么操作的类型
  • 人们习惯将结构体的数据成员设为公有,因此这时用结构体更方便

定义

struct 结构体名称{
    共有成员
protected:
    保护型成员
private:
    私有成员
}

结构体中可以有数据成员和函数成员

结构体的初始化
如果:

  • 一个结构体的全部数据成员都是公共成员
  • 没有用户定义的构造函数
  • 没有基类和虚函数

这个结构体的变量可以用下面的语法形式初始化
类型名 变量名 = {成员数据1初始值,…}

联合体

定义

union 联合体名称{
    共有成员
protected:
    保护型成员
private:
    私有成员
}

特点:

  • 成员共用同一组内存单元
  • 任何两个成员不会同时有效

枚举类

定义
enum class 枚举类型名:底层类型{枚举值列表}
例子:
enum class Type{General,Light}
enum class Type:char{General,Light}

枚举类的优势

  • 强作用域:作用域限制在枚举类中
  • 转换限制:枚举类对象不可以与整型隐式转换
  • 可以指定底层类型
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值