20:43:40 第三章类与对象 本章主要内容: 1.类和对象、类的创建、对象的创建和使用一重点(掌握 2.this指针 重点难点(掌握) 3.访问控制、封装与信息隐藏一重点难点(理解) 4.友元 重点 5.静态成员 6. cons t与类成员
20:43:40 第三章 类与对象 本章主要内容: 1. 类和对象、类的创建、对象的创建和使用 --重点(掌握) 2. this指针 -- 重点 难点(掌握) 3. 访问控制、封装与信息隐藏 -- 重点 难点(理解) 4. 友元 -- 重点 5. 静态成员 6. const与类成员
20:43:40 §1概念 程序举例 银行帐户 链表操作
20:43:40 §1 概 念 程序举例 .银行帐户 .链表操作
存在的问题 函数名可能与对其它结构进行操作的函数发生冲突 客户程序员易忘记调用 initialize0和 cleanup0 数据和对数据进行的操作分离,不符合现实世界中事物的 实际情况,也不符合人的思维习惯 数据完全对外暴露,无法保证对数据的访问的合法性、安 全性 °解决方法 把对数据进行操作的函数做成结构体的成员,以解决名字 冲突和数据与操作的分离问题 例:.修改后的银行帐户 修改后链表操作 ·将结构体改换为类,并在类上进行访问控制以解决数据外 露的问题 ·例:.银行帐户类 链表类 °用类的构造函数与析构函数保证初始化和清除工作一定会 进行 第四章
20:43:40 •存在的问题 – 函数名可能与对其它结构进行操作的函数发生冲突 – 客户程序员易忘记调用initialize()和cleanup() – 数据和对数据进行的操作分离,不符合现实世界中事物的 实际情况,也不符合人的思维习惯 – 数据完全对外暴露,无法保证对数据的访问的合法性、安 全性 •解决方法 •把对数据进行操作的函数做成结构体的成员,以解决名字 冲突和数据与操作的分离问题 例:.修改后的银行帐户 .修改后链表操作 •将结构体改换为类,并在类上进行访问控制以解决数据外 露的问题 • 例:.银行帐户类 .链表类 •用类的构造函数与析构函数保证初始化和清除工作一定会 进行 --- 第四章
风043:40 概念: 对象:现实世界中事物或实体在计算机中的抽象描述或 表 类:对象的抽象描述和概括,从总体上描述了这一类对 象拥有的属性(说明对象的结构)和具有的行为 成员变量:结构体或类内部的变量称为结构体或类的成 员变量 成员函数:结构体或类内部的函数称为结构体或类的成 员函数 二者统称为结构体或类的成员
20:43:40 •概念: – 对象:现实世界中事物或实体在计算机中的抽象描述或 表示 – 类:对象的抽象描述和概括,从总体上描述了这一类对 象拥有的属性(说明对象的结构)和具有的行为 – 成员变量:结构体或类内部的变量称为结构体或类的成 员变量 – 成员函数:结构体或类内部的函数称为结构体或类的成 员函数 二者统称为结构体或类的成员
风0:43:0 §2类与对象 类 类的定义 例:点类 c1ass类名 class Point private private: float fx fY: 私有成员表; public: public void setX(int x)(fX=x 公有成员表; void setY(int y)(fY=y protected: float getXO return fX 保护成员表; float geto return fY;
20:43:40 §2 类与对象 class 类名 { private: 私有成员表; public: 公有成员表; protected: 保护成员表; }; 例:点类 class Point{ private: float fX,fY; public: void setX(int x){fX=x;} void setY(int y){fY=y;} float getX(){return fX;} float getY(){return fY;} }; 一.类 .类的定义:
风0:43:0 说明: c1ass:关键字 类名:需满足标识符的要求 成员表:若干成员构成的列表 成员包括数据成员(对应于属性)和函数成员(对应于行为 操作) 数据成员一般是变量或其它类的对象 成员变量 函数成员一般是函数的声明或定义-成员函数 private、 public、 protected:关键字,用于对类中的成员 进行访问控制,在类中可以任意次序出现任意多次,分别 表示其后的成员为私有成员、公有成员和保护成员 般将成员变量定义成私有的,而将成员函数定义成公有 的,将提供给客户程序员使用的函数声明成公有的,而将在 类内部使用的辅助函数声明成私有的
20:43:40 说明: .class:关键字 .类名:需满足标识符的要求 .成员表:若干成员构成的列表 成员包括数据成员(对应于属性)和函数成员(对应于行为、 操作) 数据成员一般是变量或其它类的对象 ----- 成员变量 函数成员一般是函数的声明或定义 ----- 成员函数 .private、public、protected:关键字,用于对类中的成员 进行访问控制,在类中可以任意次序出现任意多次,分别 表示其后的成员为私有成员、公有成员和保护成员 .一般将成员变量定义成私有的,而将成员函数定义成公有 的,将提供给客户程序员使用的函数声明成公有的,而将在 类内部使用的辅助函数声明成私有的
风0:43:40 类的成员函数 在类中声明或定义的函数 成员函数定义:两种方法 在类中定义:创建类的同时,在类中直接给出函数体 例: class point{ float fx fY. public void setX(int x)fX=x void sety (int y)(fY=y float getX()( return fX f loat gety()( return fY; 这样的成员函数将成为内联函数,故其函数体应尽可能简洁 在类中声明,在类外定义(实现):使用作用范围解析运算符: 一般把声明放在h的文件中,该文件称做类的接口文件 而把定义放在.cpp的文件,该文件称做类的实现文件 例:银行帐户 链表类
20:43:40 类的成员函数 .在类中声明或定义的函数 .成员函数定义: 两种方法 .在类中定义:创建类的同时,在类中直接给出函数体 例:class Point{ float fX,fY; public: void setX(int x){fX=x;} void setY(int y){fY=y;} float getX( ){ return fX;} float getY( ){ return fY;} }; 这样的成员函数将成为内联函数,故其函数体应尽可能简洁 .在类中声明,在类外定义(实现):使用作用范围解析运算符:: 一般把声明放在.h的文件中,该文件称做类的接口文件 而把定义放在.cpp的文件,该文件称做类的实现文件 例:.银行帐户 .链表类
20:43:40 二.对象 对象:把数据和对数据的操作集成在一起形成的独立实体 类的变量,一个类的对象是该类的一个实例 创建(定义对象的一般形式 类名对象名列表; 1]: Point ptl, pt2, *pPtr 对象的使用:与结构体变量的使用方法相近 通过对象名使用对象的成员(公有成员) 对象名.成员名 例:pt1.setX(100); pt1 setY (10) 通过指向对象的指针使用对象 对象指针变量->成员名 例:pPtr= new Point;//或pPtr=&pt1; pPtr->setX(10) pPtr->setY(20)
20:43:40 二.对象 .对象:把数据和对数据的操作集成在一起形成的独立实体 类的变量,一个类的对象是该类的一个实例 .创建(定义)对象的一般形式: 类名 对象名列表; 例: Point pt1,pt2,*pPtr; .对象的使用:与结构体变量的使用方法相近 .通过对象名使用对象的成员(公有成员): 对象名.成员名 例: pt1.setX(100); pt1.setY(10); .通过指向对象的指针使用对象 对象指针变量->成员名 例:pPtr=new Point; //或 pPtr=&pt1; pPtr->setX(10); pPtr->setY(20);
20:43:40 对象在内存中的存储 创建对象时以类为样板,分配内存空间 Point ptl, pt 2: ptl setX(10); pt1 setY(15) pt2. setX(100); pt 2. setY (12); pt2 fX 10 类 Point的公用区 100 fX fY 15 setX0代码 fY setO setY0代码 setO setYo getX0代码 setYo getXO getY0代码 getXO getO getY O 创建对象时通常仅分配成员变量的空间,而成员函数的代码 由各个对象共享 逻辑上每个对象都包含了一份类中定义的成员
20:43:40 对象在内存中的存储 .创建对象时以类为样板,分配内存空间 Point pt1,pt2; pt1.setX(10);pt1.setY(15); pt2.setX(100);pt2.setY(12); 15 10 fY fX setX() setY() getX() getY() pt1 12 100 fY fX setX() setY() getX() getY() pt2 getY()代码 getX()代码 setY()代码 setX()代码 类Point的公用区 . 创建对象时通常仅分配成员变量的空间,而成员函数的代码 由各个对象共享 . 逻辑上每个对象都包含了一份类中定义的成员
风0:43:0 §3this指针 问题: 类 Account的成员函数中,并没有指明引用的 sName、sID 和fBa1ance分别是哪一个对象的成员,若创建了多个该类的 对象,比如: Account accl, acc2.. 如何保证acc1. Initialize(.)、ac1. Deposit() ac1. Withdraw()和ac1.Get- ba lance0操作的是acc1内部 的成员变量,而ac2. Initialize(.)、ac2. Deposit(.) acc2. Wi thdraw()和acc2. Get balance0操作的是aCc2中的 成员变量?
20:43:40 §3 this指针 问题: 类Account的成员函数中,并没有指明引用的sName、sID 和fBalance分别是哪一个对象的成员,若创建了多个该类的 对象,比如: Account acc1,acc2,…; 如 何 保 证 acc1.Initialize(…) 、 acc1.Deposit(…) 、 acc1.Withdraw(…)和acc1.Get_balance()操作的是acc1内部 的成员变量,而acc2.Initialize(…)、acc2.Deposit(…)、 acc2.Withdraw(…)和acc2.Get_balance()操作的是acc2中的 成员变量?