第四章 类与对象 (郑莉版C++程序语言设计学习笔记)

加粗样式编写程序的目的是描述和解决现实世界中的问题,第一步就是要将现实中的类如实地反应在程序中。
本章主要介绍面向对象设计方法的主要特点:抽象,封装,继承,多态

4.1面向对象的程序设计的基本特点

4.1.1 抽象

面向对象的方法中的抽象,是对具体问题(对象)进行概括,抽出一类对象的公共属性并加以描述的过程。
对问题的抽象过程,也是对问题的分析和认识过程。
对于一个问题的抽象包含两个方面:数据抽象和行为抽象。(或称为,功能抽象和代码抽象)
前者是描述某类对象的属性或状态,后者是描述某类对象共同行为或功能特征。

4.1.2 封装

封装就是将抽象得到的数据和行为相结合,形成一个游记的整体,也就是将数据与操作数据的函数代码进行有机的结合,形成“类”,其中的数据和函数都是类的成员。
可以对成员访问权限的合理控制,使不同类之间的相互影响减少到最低限度,进而增强数据的安全性和简化程序的编写工作。

4.1.3继承

C++ 提供类的继承机制,允许程序员在保持原有类特性的基础上,进行更具体,更详细的说明。

4.1.4 多态

多态性是指一段程序能够处理多种类型对象的能力。在C++中,这种多态性可以通过强制多态,重载多态,类型参数化多态,包含多态四种形式来实现。

  1. 强制多态,数据类型转换,表面多态
  2. 重载多态 函数重载,运算符重载,表面多态
  3. 类型参数化多态 函数模板,类模板,一般多态
  4. 包含多态 虚函数 一般多态

类和对象

在面向过程的结构化程序设计中,程序的模块是由函数构成的,函数将逻辑上相关的语句和数据封装,用于完成特定的功能。
在面向对象的程序设计中,程序模块是由类组成的。类是对逻辑上相关的函数与数据的封装,它是对问题的抽象描述。
另一角度
变量的声明如int i,int 类型包括了数据本身的属性以及对属性的操作,但是基本数据类型是有限的,C++的基本数据类型也远远不能满足描述现实世界中各种对象的需要。类就相当于用户自定义的类型。不仅可以用int型表示整数,也可以用类来表示“时钟”,“人”等对象。

4.2.1类的定义

语法:
class 类名称
{
public:
外部接口
protected:
保护型成员
private:
私有成员
};
在中可以只声明函数的原型,函数的实现(即函数体)可以在类外定义。

4.2.2类成员的访问控制

访问控制分为三种:

  1. 公有类型成员定义了类的外部接口
  2. 私有成员只能被本类成员函数访问,来自类外部的任何访问都是非法的。
  3. 保护类型成员的性质和私有成员的性质相似,其差别在于继承过程中产生的新类影响不同。

习惯
一般情况下,一个类的数据成员都应该声明为私有成员,这样内部数据结构不会对类意外的其余部分造成影响,程序模块之间的相互作用就被降低到最小。

4.2.3 对象

类实际上一种抽象机制,它描述了一类事物的共同属性和行为。对象就是这一类数据结构的某一特定实体(也是实例)。
对象所占的内存空间只是用于存放数据成员的。
在类的外部只能访问到类的公有成员;在类的内部成员函数,可以访问到类的全部成员。

4.2.4 类的成员函数

函数的实现:
返回值类型 类名::函数成员名(参数表)
{
函数体
}
成员函数调用中的目的对象:
使用“.”操作符指出调用所针对的对象,这一对象在本次调用中称为目的对象
在类的成员函数中,可以访问目的对象的私有成员,又可以访问当前类的其他对象的私有成员。

带有默认形参值的成员函数:

类成员函数的默认值,一定要写到类定义中,而不能写在类定义之外的函数实现中。

内联函数成员:
隐式声明:将函数体直接放在类内。
显式声明:采用inline显式声明
和普通内联函数一样

4.3 构造函数和析构函数

在定义对象的时候进行数据成员设置,称为对象的初始化。
C++的初始化由构造函数完成,清理工作由析构函数完成

4.3.1构造函数

在遇到对象声明语句时,程序会向操作系统申请一定的内存空间,我们希望编译器可以在分配内存空间一样将初始值写入,但是,类的对象太过复杂,编译器不知道如何产生代码来实现初始化。
所以程序员要自己编写初始化程序。
构造函数的作用就是在对象被创建时利用特定的值构造对象,将对象初始化为一个特定状态。

特点
  1. 构造函数与类名相同
  2. 没有返回值
  3. 通常被声明为公有函数
  4. 只要类中有构造函数,编译器会自动插入对构造函数调用的代码。即构造函数在对象创建的时候将被自动调用。
  5. 无需提供参数的构造函数称为默认构造函数。如果类中没有写构造函数,编译器会自动生成一个隐含的默认构造函数。如果自己声明了构造函数,编译器便不会生成。
#include <iostream>
using namespace std;

class Clock {
    public:
        Clock (int newH , int newM,int newS);
        void setTime(int newH,int newM,int newS);
        void showTime();
    private:
        int hour,minute,second;
};

Clock::Clock(int newH,int newM,int newS){
    hour = newH;
    minute = newM;
    second = newS;
}

int main(){
    
}

4.3.2复制构造函数

复制构造函数的能力:
生成一个对象的副本时,可以新建一个对象,然后将每一个数据元素进行复制,但过于繁琐
不如将类具有自行复制对象的能力。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值