C语言进阶

张萃

目录

  • 1 第一章  C++的初步知识
    • 1.1 从C到C++
    • 1.2 C++的词法和词法规则
    • 1.3 最简单的C++程序
    • 1.4 C++对C的扩充
      • 1.4.1 C++的输入输出
      • 1.4.2 用const定义常量
      • 1.4.3 函数原型声明
      • 1.4.4 函数重载
      • 1.4.5 函数模板
      • 1.4.6 有默认参数的函数
      • 1.4.7 变量的引用
      • 1.4.8 内置函数
      • 1.4.9 作用域运算符
      • 1.4.10 字符串变量
      • 1.4.11 动态分配/回收内存运算符
  • 2 类和对象
    • 2.1 面向对象程序设计方法概述
    • 2.2 类的声明和对象的定义
    • 2.3 类的成员函数
    • 2.4 对象成员的引用
    • 2.5 类和对象的简单应用
    • 2.6 类的封闭性和信息隐蔽
  • 3 关于类和对象的进一步讨论
    • 3.1 构造函数
    • 3.2 析构函数
    • 3.3 调用构造函数和析构函数的顺序
    • 3.4 对象数组
    • 3.5 对象指针
    • 3.6 共用数据的保护
    • 3.7 对象的动态建立和释放
    • 3.8 对象的赋值和复制
    • 3.9 静态成员
    • 3.10 友元
    • 3.11 类模板
  • 4 运算符重载
    • 4.1 什么是运算符重载
    • 4.2 运算符重载的方法
    • 4.3 重载运算符的规则
    • 4.4 运算符重载函数作为类成员函数和友元函数
    • 4.5 重载双目运算符
    • 4.6 重载单目运算符
    • 4.7 重载流插入运算符和流提取运算符
  • 5 继承与派生
    • 5.1 继承与派生的概念
    • 5.2 派生类的声明方式
    • 5.3 派生类的构成
    • 5.4 派生类成员的访问属性类型兼容规则
    • 5.5 派生类的构造函数和析构函数
    • 5.6 多重继承
  • 6 多态性与虚函数
    • 6.1 多态性的概念
    • 6.2 一个典型的例子
    • 6.3 虚函数
    • 6.4 纯虚函数与抽象类
  • 7 输入输出流
    • 7.1 C++的输入输出
    • 7.2 标准输出流
    • 7.3 标准输入流
    • 7.4 对数据文件的操作与文件流
    • 7.5 字符串流
面向对象程序设计方法概述


       对于规模比较小的程序,程序员可以直接编写出一个面向过程的程序,能详细地描述每一瞬间的数据结构和对其操作的过程。但是当程序规模越来越大,面向过程的程序语言就显得力不从心,面向对象程序设计语言就应运而生,C++ 就是其中的一个成员。

       一、什么是面向对象的程序设计 

       面向对象的程序设计的思路与人们日常生活中处理问题的思路是相似的。一个复杂的事物总是由许多部分组成的。例如,一辆汽车是由发动机、底盘、车身和车轮等部件组成。当人们生产汽车时,不是先设计和制造发动机,再设计和制造底盘,然后设计和制造车身和车轮,而是分别设计和制造发动机、底盘、车身和车轮,最后把它们组装起来。这就是面向对象的基本思路。

     1、对象

      客观世界中任何一个事物都可以看成一个对象。对象可以是自然物体,也可以是社会中的一种组织结构(班级、系、学校)甚至一个图形、一项计划等都可以看成对象。复杂的对象由简单的对象组成,例如火车站对象包含售票处、行李房、候车室和站台、信号灯、铁轨和通信设施等对象。对象是构成系统的基本单位。任何一个对象都具有静态和动态的特征。

      例如,班级这个对象具有从属一个系和专业、学生人数、组建时间等静态特征,它还具有出操、学习、参加运动会等动态特征。静态特征称为属性,动态特征称为行为,外界给对象发出的信息一般称作消息。

      一个对象往往包含一组属性和一组行为。如电视机包括生产厂家、品牌、屏幕尺寸等是静态特征,开机、关机、选择频道、调节音量、调节彩色等是动态特征。

面向对象的程序设计在设计一个系统时,首先要确定系统中包括哪些对象,要分别设计这些对象。

      在C++ 中,每个对象由数据和函数(操作代码)两部分组成。数据代表了属性,函数是对数据操作的代码,代表了行为。例如三条边长是三角形的属性,利用三条边长计算三角形面积、输出计算结果,实现这些操作的代码就是对象的行为,在程序设计中又称方法。调用对象中的函数就是向对象传递一个消息,要求对象执行某个操作。

    2、封装与信息隐蔽 

      对一个对象进行封装处理,把它的一部分属性和功能向外界屏蔽,从外面看不到这些属性和功能。例如录像机里有电路板和机械控制部件,由于有机壳的保护,在外面只看到一个黑箱子,在它的表面有若干个按键。人们只需知道这些按键的功能即可操作录像机。而不必知道录象机的工作原理和系统结构。

      在设计一个对象时,要周密地考虑如何进行封装,把不必让外界知道的部分隐蔽起来。也就是说,把对象的内部实现和外部行为分隔开来。

      封装性是面向对象程序设计的一个重要特点,封装在此有两个含义:

      ①把有关的数据和操作代码封装在一个对象中,形成程序中的一个基本单位,各个对象之间相互独立,互不干扰。

      ②把对象中的某些部分对外隐蔽,只留下与外界联系的接口接收外界的消息,这种对外界隐蔽的做法称为信息屏蔽。

      封装把对象内部实现与外部分隔开,外界不了解对象内部的具体细节,其实外界也不需要了解。外界需要真正了解的是对象的对外接口。

      C++ 对象中的公有函数就是对象的对外接口。外界通过调用公有函数,访问对象中的数据成员,完成指定的操作。

    3、抽象

      抽象是表示同一类事物本质的方法,它关注事物本质特征,对象是具体的,例如某学院2018级计算机软件专业的一个学生是一个对象,可以将一组同类对象的共同特征抽象出来,从而形成类的概念。可以将前面所提的某学院2018级计算机软件专业的所有学生可抽象出2018级计算机软件专业学生类。

      类是对象的抽象,而对象是类的具体实例。

     4、继承与重用 

     如果已经建立名为A 的类,现要建立一个名为 B 的类,而B 类与A 类的内容基本相同,只是在 A 类基础上增加了一些属性和行为,这样只需在 A 类的基础上添加新内容即可,这就是面向对象程序设计中的继承机制。

     C++也具有继承机制,利用这个机制可以在一个已有的类的基础上建立一个新类,这也是软件重用思想,不仅可以利用自己过去建立的类,而且还可以利用其他人放在类库中的类建立类,这就大大缩短了软件开发周期。

      5、 多态性 

    多个相似而不完全相同的对象,收到外界给的同一个消息时,它们各自执行不同的操作,这种现象叫多态现象。

     例如在windows中,用鼠标双击一个文件对象时,如果它是可执行文件则会执行文件中的程序,如果它是一个文本文件则会启动一个编辑器来打开这个文件,这就是面向对象程序设计中的多态性一个实际例子。

    在C++中所谓多态性是指:由继承而产生的新类,它的对象对同一个消息会作出不同的响应。

    二、面向对象程序设计的特点 

    1、面向过程程序设计的缺点

    传统的面向过程程序设计是围绕功能进行的,用一个函数实现一个功能,一个函数可以使用任何一组数据,一组数据可以被多个函数使用。当程序规模越来越大,数据越来越多(如图2.3),操作越来越复杂,这种方法容易出现错误,程序员往往感到难以应付。




    2、面向对象程序设计的特点

    它面对的是一个个对象。实际上每组数据都有特定的用途,它是某种操作的对象。也就是说,一组操作调用一组数据。

    例如三角形的三条边长 a、b、c 它们只与计算该三角形的面积、三角形的周长等操作有关,与其他操作无关。我们把这三个数据和计算三角形面积、周长等操作的代码放在一起,封装成一个对象,与外界相对分隔。这也符合客观世界的本来面目。

    面向对象程序设计包括两个方面:

    ①设计所需的各种类,即决定把哪些数据和操作封装在一起。

    ②考虑怎样向对象发送消息(调用对象的成员函数),实现所需的操作。这时设计程序象一个总调度,不断地向各个对象发送消息(命令),让这些对象活动起来(激活这些对象),完成各自的职责范围工作,各个对象的操作完成,整体任务也就完成了。

    三、类和对象的作用 

    类是C++中十分重要的概念,它是实现面向对象程序设计的基础。C++ 对C改进,其中最重要的就是增加了类这样一种类型。类是所有面向对象的语言的共同特征,所有面向对象的语言都提供了这种类型。一个有一定规模的C++程序是由许多类构成的。可以说类是C++的灵魂。

    C++支持面向过程的程序设计,也支持基于对象和面向对象的程序设计。从本章到第四章介绍基于对象的程序设计。包括类和对象的概念、类的机制和声明、对象的定义与使用等。这是面向对象程序设计的基础。

    基于对象就是基于类,基于对象的程序是以类和对象为基础的,程序的操作是围绕对象进行的。在此基础上利用继承机制和多态性,就成为面向对象的程序设计。

基于对象程序设计所面临的是一个个对象。所有的数据分别属于不同的对象。

    面向过程的程序设计中数据可以是公用的或者说是共享的,是缺乏保护的。缺乏保护的数据容易导致程序失败。其实程序中一组数据是为一种操作准备的,也就是说一组数据与一种操作对应。因此把一组数据和相关的操作放在一起,这就是面向对象程序设计中的对象。

    在面向过程的结构化程序设计中,人们用下面的公式描述程序:

             程序=数据结构+算法

    算法和数据结构两者是相互独立的,是分开设计的。面向过程的程序设计是以数据结构为基础的算法设计。

    在实践中人们逐渐认识到算法和数据结构是互相紧密联系不可分的。应当以一个算法对应一组数据结构,而不宜提倡一个算法对应多组数据结构,以及以一组数据结构对应多个算法。基于对象和面向对象程序设计就是把一个算法和一组数据结构封装在一个对象中,形成了新的观念: 

            对象=数据结构+算法

     发出的命令,让各个对象完成相应的任务。

            程序=(对象+对象+…+对象)+消息

     消息的作用就是对对象进行控制。程序设计的关键是设计好每个对象,以及确定向这些对象发送各种消息。

     四、面向对象的软件开发

     1.面向对象分析

     面向对象分析,要按照面向对象的概念和方法,在对任务的分析中,从客观事物和事物之间的关系归纳出有关对象(对象的属性和行为)以及对象之间的联系。并将具有相同属性和行为的对象用一个类来表示。

     2.面向对象的设计

     根据面向对象分析阶段形成的需求模型,对每一部分分别进行具体的设计,首先是进行类的设计,类的设计可能包含多个层次(利用继承和派生机制)。然后以这些类为基础提出程序设计的思路和方法,包括了算法的设计。在此设计阶段,并不牵涉某一具体的计算机语言。

     3.面向对象编程

     根据面向对象设计的结果,用一种计算机语言把它写成程序。

       C++

       Dephi

       VB

       Java

     4.面向对象测试

     写完程序交付用户使用前,必须对程序进行严格的调试,如果发现错误,要及时改正。

     面向对象测试,是以类作为测试的基本单元用面向对象的方法实施测试。

     5. 面向对象维护

     任何软件产品在使用过程中,可能用户需要改进软件的性能,这就需要修改程序。由于采用了面向对象的方法,方便了维护程序。因为类的封装性,修改一个类对其他类(非子类)影响很小,极大提高了程序维护的效率。