2.52k likes | 2.64k Views
上机调整 (2 号教学楼 3 楼最东边的教室 ). 第 4 、 5 、 6 周 。 周六 上午 ( 赵小红 )/ 下午 ( 刘勇 )/ 晚上 ( 孙涛 ) , 周日 / 上午 ( 梅天灿 )/ 下午 ( 邓德祥 ) 上机。 第 7 周开始到 18 周 , 偶数周上机 。(按 原计划 ) 每次 4 学时: 周六全天 (上午 8 : 00 ---11 : 30 下午 2 : 00---5 : 30 晚上 6 : 00----9 : 30 ) 周日 (上午 8 : 00 ---11 : 30 下午 2 : 00---5 : 30 ).
E N D
上机调整(2号教学楼3楼最东边的教室) • 第4、5、6周。 • 周六上午( 赵小红 )/下午(刘勇)/晚上(孙涛 ), • 周日/上午(梅天灿 )/下午(邓德祥) 上机。 • 第7周开始到18周,偶数周上机。(按原计划) • 每次4学时: • 周六全天 (上午8:00 ---11:30 下午2:00---5:30晚上6:00----9:30) • 周日 (上午8:00 ---11:30 下午2:00---5:30)
上机调整(2号教学楼3楼最东边的教室) • 第7周开始到18周,偶数周上机。 • 每次4学时: • 上午8:00 ---11:30 • 下午2:00---5:30 • 晚上6:00----9:30 • 注意: • 是上课的那天,而非周末!
程序提交方式 • 1、删除项目文件夹中的debug/release文件夹; • 2、把整个项目压缩后提交(就是整个项目的文件夹)。
第二章 C++面向对象程序设计 面向对象程序设计
本章内容提要 • 面向对象程序设计概述 • C++类 • 类的继承 • 多态性和虚函数 • 重载 • C++模板 • Microsoft Visual C++的语法扩充
本章内容提要 • 与传统的面向过程的程序设计语言相比,C++语言的最大特征是支持面向对象程序设计OOP(Object Oriented Programming),它引入了类、继承、多态和重载等面向对象的新机制。通过本章的学习,使我们系统地介绍C++面向对象设计的基本方法。
本章内容提要(第1节) • 面向对象程序设计概述 • C++类 • 类的继承 • 多态性和虚函数 • 重载 • C++模板 • Microsoft Visual C++的语法扩充 1、传统的结构化程序设计; 2、面向对象程序设计方法及特征;
本章内容提要(第2节) • 面向对象程序设计概述 • C++类 • 类的继承 • 多态性和虚函数 • 重载 • C++模板 • Microsoft Visual C++的语法扩充 1、类的定义与实现; 2、构造函数和析构函数; 3、this指针; 4、静态成员; 5、友元
本章内容提要(第3节) • 面向对象程序设计概述 • C++类 • 类的继承 • 多态性和虚函数 • 重载 • C++模板 • Microsoft Visual C++的语法扩充 1、基类和派生类; 2、基类和派生类的构造函数; 3、多重继承; 4、虚基类
本章内容提要(第4节) • 面向对象程序设计概述 • C++类 • 类的继承 • 多态性和虚函数 • 重载 • C++模板 • Microsoft Visual C++的语法扩充 1、用基类指针指向派生类对象; 2、虚函数; 3、抽象类和纯虚函数
本章内容提要(第5节) • 面向对象程序设计概述 • C++类 • 类的继承 • 多态性和虚函数 • 重载 • C++模板 • Microsoft Visual C++的语法扩充 1、函数重载; 2、运算符重载
本章内容提要(第6节) • 面向对象程序设计概述 • C++类 • 类的继承 • 多态性和虚函数 • 重载 • C++模板 • Microsoft Visual C++的语法扩充 1、函数模板; 2、类模板
本章内容提要(第7节) • 面向对象程序设计概述 • C++类 • 类的继承 • 多态性和虚函数 • 重载 • C++模板 • Microsoft Visual C++的语法扩充 1、VC自定义数据类型; 2、VC运行库; 3、运行时类型识别; 4、编程规范
结构化程序设计 内 容 提 要 结构化程序设计的特点: • 是一种自上而下、逐步细化的模块化程序设计方法。 • Niklaus Wirth的观点:算法 + 数据结构 = 程序 • 是一种面向过程程序设计方法,即一个程序是由多个过程(在C++中为函数)模块组成,过程之间通过函数参数和全局变量进行相互联系。 面向对象程序设计概述 C++类 类的继承 多态性和虚函数 重载 C++模板 VC的语法扩充
结构化程序设计的特点 内 容 提 要 • 与非结构化程序相比,结构化程序在调试、可读性和可维护性等方面都有很大的改进。 • 代码重用性不高。 • 由于软、硬件技术的不断发展和用户需求的变化,按照功能划分设计的系统模块容易发生变化,使得开发出来的模块的可维护性欠佳。 • 面向过程模式将数据与过程分离,若对某一数据结构做了修改,所有处理数据的过程都必须重新修订。 面向对象程序设计概述 C++类 类的继承 多态性和虚函数 重载 C++模板 VC的语法扩充
面向对象程序设计的特点 内 容 提 要 • OOP围绕现实世界的概念来组织模块,采用对象描述问题空间的实体。 • SP是以功能为中心来描述系统,而OOP是以数据为中心来描述系统。相对于功能而言,数据具有更强的稳定性。 • OOP模拟了对象之间的通信。就象人们之间互通信息一样,对象之间也可以通过消息进行通信。 面向对象程序设计概述 C++类 类的继承 多态性和虚函数 重载 C++模板 VC的语法扩充
面向对象程序设计的特点 内 容 提 要 • OOP把一个复杂的问题分解成多个能够完成独立功能的对象(类),然后把这些对象组合起来去完成这个复杂的问题。 • 一个对象可由多个更小的对象组成。这些对象(类)可由不同的程序员来设计,可在不同程序中使用。 • 采用面向对象模式就象在流水线上工作,我们最终只需将多个零部件(已设计好的对象)按照一定关系组合成一个完整的系统。 面向对象程序设计概述 C++类 类的继承 多态性和虚函数 重载 C++模板 VC的语法扩充
面向对象程序设计的特点 内 容 提 要 • 对象 = 数据 + 对这些数据的操作 • 面向对象程序设计的四个基本特征: • 抽象 • 封装 • 继承 • 多态 面向对象程序设计概述 C++类 类的继承 多态性和虚函数 重载 C++模板 VC的语法扩充
基本数据类型 操作方便! 一看就懂! 代码简单! 内 容 提 要 • 整数类型 int a=10; int b=20; int sum=a+b; //30 cout<<sum; • 浮点数类型 float m=1.5f; float n=3.4f; float sum=m+n; //4.9 cout<<sum; 面向对象程序设计概述 C++类 类的继承 多态性和虚函数 重载 C++模板 VC的语法扩充
自定义数据类型 内 容 提 要 • 结构体-例如复数 struct Complex { int nReal; int nImaginary; }; Complex cp1, cp2; cp1.nReal=10; cp1.nImaginary=15; cp2.nReal=20; cp2.nImaginary=25; 面向对象程序设计概述 C++类 类的继承 多态性和虚函数 重载 C++模板 VC的语法扩充
自定义数据类型 操作麻烦! 理解困难! 代码复杂! 内 容 提 要 Complex cpSum; cpSum.nReal = cp1.nReal+cp2.nReal; cpSum.nImaginary = cp1.nImaginary+cp2.nImaginary; cout<<cpSum.nReal<<‘+’<<cpSum.nImaginary<<‘i’; 面向对象程序设计概述 C++类 类的继承 多态性和虚函数 重载 C++模板 VC的语法扩充
C++是否能提供简单、容易的编程方法? Complex cp1(10,15), cp2(20,25); Complex cpSum=cp1+cp2; cout<<cpSum; • 如果能以上面的方式来书写代码,那么一看就懂,代码书写也简单。 内 容 提 要 面向对象程序设计概述 C++类 类的继承 多态性和虚函数 重载 C++模板 VC的语法扩充
方法1:用结构体实现 C++增强了结构体的功能。 方法2:用类实现 C++的新特性。 C++提供两种方式实现这样的编程 内 容 提 要 面向对象程序设计概述 C++类 类的继承 多态性和虚函数 重载 C++模板 VC的语法扩充
用结构体实现 void main() { Complex cp1(1, 2), cp2(3, 4); Complex cp = cp1+cp2; cout<<cp<<endl; } 内 容 提 要 struct Complex{ int i; int j; Complex(int ii, int jj) { i=ii; j=jj; } }; ostream& operator <<(ostream& os, const Complex &cp) { cout<<cp.i<<'+'<<cp.j<<'i'; return os; } Complex operator +(const Complex &cp1, const Complex &cp2){ return Complex (cp1.i+cp2.i, cp1.j+cp2.j); } 面向对象程序设计概述 C++类 类的继承 多态性和虚函数 重载 C++模板 VC的语法扩充
通常不使用结构体的这种新功能! 内 容 提 要 为了维持对C的兼容性而不使用。 面向对象程序设计概述 C++类 类的继承 多态性和虚函数 重载 C++模板 VC的语法扩充 以C++新增功能“类”来实现。
用类实现 void main() { Complex cp1(1, 2), cp2(3, 4); Complex cp = cp1+cp2; cout<<cp<<endl; } class Complex{ public: int i; int j; Complex(int ii, int jj) { i=ii; j=jj; } }; ostream& operator <<(ostream& os, const Complex &cp) { cout<<cp.i<<'+'<<cp.j<<'i'; return os; } Complex operator +(const Complex &cp1, const Complex &cp2){ return Complex (cp1.i+cp2.i, cp1.j+cp2.j); } 内 容 提 要 面向对象程序设计概述 C++类 类的继承 多态性和虚函数 重载 C++模板 VC的语法扩充
什么是类(class)? • 类是对一组有相同特性(数据)和相同行为(函数)的对象的描述。 • 例如 “汽车” 描述:是由本身动力驱动,装有驾驶装置,能在固定轨道以外的道路或地域上运送客货或牵引车辆的车辆。 数据:品牌,车高,车长,车宽,轮子的数量,… 行为:行驶,鸣笛,亮灯,… 内 容 提 要 面向对象程序设计概述 C++类 类的继承 多态性和虚函数 重载 C++模板 VC的语法扩充
如何理解类? • 类实际上也是数据类型。例如,浮点数也有一组特性和行为。区别在于程序员定义类是为了与具体问题相适应,而不是被迫使用已存在的数据类型。 • 结构体只是数据的凝聚(注意:C++中能添加函数),而类是数据和行为的统一。 内 容 提 要 面向对象程序设计概述 C++类 类的继承 多态性和虚函数 重载 C++模板 VC的语法扩充
什么是对象? • 对象是类的一个实例。例如,汽车是一个类,而行驶在公路上的一辆汽车则是一个对象。 内 容 提 要 面向对象程序设计概述 C++类 类的继承 多态性和虚函数 重载 C++模板 VC的语法扩充
类与对象的关系 • 类是抽象的,对象是具体的。 • 类相当于数据类型(如:int, float),而对象则相当于变量/常量(如:a, pi, 2, 3.1415)。 内 容 提 要 面向对象程序设计概述 C++类 类的继承 多态性和虚函数 重载 C++模板 VC的语法扩充 变量:变量名为a 数据类型:整数 int a; Car b; 类:类名为Car 对象:对象名为b
类与对象的使用 • 类与普通的数据类型一样,可声明变量、可作为函数的返回类型; • 对象与普通的变量一样,可作为函数参数、可作为函数的返回值; 内 容 提 要 面向对象程序设计概述 C++类 类的继承 多态性和虚函数 重载 C++模板 VC的语法扩充 void Set(Car c) { m_car = c; } Car Get() { return m_car; } void main { CarmyCar; Set(myCar); }
一个类的例子:时间类 • 类名:(前面的C表示Class) CTime • 类的数据成员:(m_表示该变量为类的成员变量,n表示为整形变量) 时: int m_nH; 分: int m_nM; 秒: int m_nS; • 类的成员函数: 显示时间:void Show(); 设置时间:void Set(int nH, int nM, int nS); 内 容 提 要 面向对象程序设计概述 C++类 类的继承 多态性和虚函数 重载 C++模板 VC的语法扩充
一个类的例子:时间类 void main() { CTime t; t.Set(10,28,31); t.Show(); } class CTime { private: int m_nH; int m_nM; int m_nS; public: void Set(int nH, int nM, int nS) { m_nH = (nH>=0 && nH<24)?nH:0; m_nM = (nM>=0 && nM<60)?nM:0; m_nS = (nS>=0 && nS<60)?nS:0; } void Show() { cout<<m_nH<<':'<<m_nM<<':'<<m_nS<<endl; } }; 内 容 提 要 面向对象程序设计概述 C++类 类的继承 多态性和虚函数 重载 C++模板 VC的语法扩充
类的定义 class 类名 { 成员变量和成员函数列表; }; 内 容 提 要 面向对象程序设计概述 C++类 类的继承 多态性和虚函数 重载 C++模板 VC的语法扩充 千万不要忘了这个分号 ;
类的定义 class CTime { int m_nH; int m_nM; int m_nS; void Set(int nH, int nM, int nS) { m_nH = (nH>=0 && nH<24) ? nH : 0; m_nM = (nM>=0 && nM<60) ? nM : 0; m_nS = (nS>=0 && nS<60) ? nS : 0; } void Show() { cout<<m_nH<<‘:’<<m_nM <<‘:’<<m_nS<<endl; } }; 内 容 提 要 成员变量 面向对象程序设计概述 C++类 类的继承 多态性和虚函数 重载 C++模板 VC的语法扩充 成员函数
“成员”的含义--属于某类,访问方法不一样 class A { public: int a; }; void main() { a=10; cout<<a<<endl; A a1; a1.a = 10; cout<<a1.a<<endl; } 内 容 提 要 面向对象程序设计概述 C++类 类的继承 多态性和虚函数 重载 C++模板 VC的语法扩充 int a; void main() { a=10; cout<<a<<endl; }
类的成员就一定能被对象访问吗? • 类的成员就一定能被对象访问吗? 内 容 提 要 面向对象程序设计概述 C++类 类的继承 多态性和虚函数 重载 C++模板 VC的语法扩充
类成员的访问控制权限 访问:指可使用该变量的值、可改变该变量的值。 class类名 { private: 私有的成员变量和成员函数列表; //只能被自己的成员函数访问 public: 公有的成员变量和成员函数列表; //可被自己的成员函数访问,可通过类的对象访问,可被派生类访问 protected: //其特性将在类的继承中得以体现 受保护的成员变量和成员函数列表; //能被自己的成员函数访问;能被派生类访问。 }; 内 容 提 要 面向对象程序设计概述 C++类 类的继承 多态性和虚函数 重载 C++模板 VC的语法扩充
类成员的访问权限控制符 成员函数 对象 派生类 public private protected 自己用 爱人用 孩子用
public class B : public A { public: void SetA(int nA) { m_nA = nA; } } void main() { A a; a.m_nA = 10; a.Set(20); } 可被成员函数访问 class A { public: int m_nA; public: void Set(int nA) { m_nA = nA; } void Show() { cout<<m_nA<<endl; } }; 可被派生类访问 可被该类的对象访问 可被成员函数访问
private class B : public A { public: void SetA(int nA) { m_nA = nA; } } void main() { A a; a.m_nA = 10; a.Set(20); } 可被成员函数访问 class A { private: int m_nA; public: void Set(int nA) { m_nA = nA; } void Show() { cout<<m_nA<<endl; } }; 不能被派 生类访问 不能被对 象访问 可被成员函数访问
protected class B : public A { public: void SetA(int nA) { m_nA = nA; } } void main() { A a; a.m_nA = 10; a.Set(20); } 可被成员函数访问 class A { protected: int m_nA; public: void Set(int nA) { m_nA = nA; } void Show() { cout<<m_nA<<endl; } }; 能被派 生类访问 不能被对 象访问 可被成员函数访问
类的成员应该设置什么访问权限? 为了保护成员变量的安全,通常将它们设置为私有属性。 class CTime { private: int m_nH; int m_nM; int m_nS; public: void Set(int nH, int nM, int nS) { m_nH = (nH>=0&&nH<24) ? nH : 0; m_nM = (nM>=0&&nM<60) ? nM : 0; m_nS = (nS>=0&&nS<60) ? nS : 0; } void Show() { cout<<m_nH<<‘:’<<m_nM<<‘:’<<m_nS<<endl;} }; 成员函数一般为类的接口,是为了让用户操作成员变量,因此设置为公有属性。
通过接口(成员函数)来访问成员变量 类 其它函数1 公有成员函数1 成员变量1 公有成员函数2 成员变量2 其它函数2 成员变量n 私有成员函数1
访问权限的作用 • 简化操作; • 数据安全; 汽车 发动 前进 发动机 电气设备 油门 后退 刹车 灯亮、灭 底盘 车身 灯光控制 鸣笛
类的实现 • 类的实现就是类的成员函数的实现,即定义类的成员函数。 • 类成员函数的定义既可以放在类的定义里面(类体里,自动成为内联函数),也可放在类定义的外面。 内 容 提 要 面向对象程序设计概述 C++类 类的继承 多态性和虚函数 重载 C++模板 VC的语法扩充
类的实现 成员函数的声明。 成员函数的声明和实现都在类体里面。 class A { private: int a; public: void Set(int na) { a=na; } }; class A { private: int a; public: void Set(int na) ; }; void A::Set(int na) { a = na; } 成员函数的实现。 作用域限定符号 ::
函数定义在类体里,自动成为内联函数 class A { private: int a; public: void Set(int na) { a=na; } }; class A { private: int a; public: inline void Set(int na) { a=na; } }; inline 可省略
函数定义在类体外,内联函数声明时必须注明inline函数定义在类体外,内联函数声明时必须注明inline class A { private: int a; public: void Set(int na); }; void A::Set(int na) { a = na; } class A { private: int a; public: inline void Set(int na); }; void A::Set(int na) { a = na; } 不可省略