C++类以及对象教学文案.pptVIP

  • 6
  • 0
  • 约8.21千字
  • 约 76页
  • 2020-06-20 发布于浙江
  • 举报
分析:在派生类B中继承了基类A的成员函数print(),又定义了一个同名的print()函数。 这种改变在静态联编的基础上编译器并不知道。 必须通知编译器这种可能的改变,即需要进行动态联编。其方法就是在基类中将可能发生改变的成员函数声明为虚函数。 main( ) { CRation r( 18, 27 );// 分配空间,调构造函数 r.Print( ); // 输出 r.Gcd( ); // 约分 r.Print( ); } 例:动态整数数组类 作为对象的数组 唯一标识的实体 封装数组元素、元素个数等信息 责任功能 按照下标的访问 数组大小可变 可获取元素个数 #include iostream.h #include string.h class Array { int *pElems; int size; // 个数 public: Array( int n ); // 构造 ~Array( void ); // 析构 void SetAt( int i, int v ); int GetAt( int i ); // 存取 int GetSize( void ); }; 类设计要点 独立性 表示独立的实体 以属性表示其特征 以行为表示其担负的责任(功能、服务) 封装性 不开放属性 提供足够的方法,支持各种用途 隐蔽内部数据结构 隐蔽方法的内部算法 复用性 适用性强、功能丰富 方法的实现(1/2) Array::Array( int n ) { // 构造n元素的数组 pElems = new int[ n ]; // 动态生成 size = n; } Array::~Array( void ) { // 撤消前被自动调用 delete [ ]pElems; // 释放空间 } int Array::GetSize( void ) { return size; // 获得数组大小 } 方法的实现(2/2) void Array::SetAt( int i, int v ) { // 按下标 i 赋值 v if( i = size ) { // 超过范围 int *p = new int[ size +5 ];// 开辟空间,复制数据 memcpy( p, pElems, size*sizeof(int) ); size+=5; delete [ ]pElems; // 释放原数组空间 pElems = p; // 保存首地址 } *(pElems + i ) = v; // 赋值 } int Array::GetAt( int i ) // 按下标 i 取元素数据 { return i size? *(pElems + i): 0; } 动态数组的使用 void main( ) { int n; Array x(10); // 数组对象实例变量 for( int i=0; i20; i++ ) { coutInput:; cin n; x.SetAt(i, n); } for( i=0; ix.GetSize( ); i++ ) cout x.GetAt(i) ; } 程序分析 对象类 = 数据结构 + 相关函数 属性 = 结构分量 方法 = 作用于结构的函数 对象实例变量 静态构造 ? 局部变量、全局变量 动态构造 ? new 类名(参数表) 函数定义 标识所属的类 可以直接访问参数和本类的数据成员 函数调用 通过对象实例调用其方法 消息传递 对象方法的激活 使用者向对象实例发消息 对象用方法函数响应消息 消息的组成 消息名 ? 函数名 消息属性 ? 参数值的列表 核心点 使用者仅关心消息的组成 对象决定哪个方法负责响应 消息传递 消息响应 不同类可以有同名方法函数 同类中可以有原型不同的方法 消息响应方法的选择 消息名 = 方法名 接收消息的对象(对象类) 匹配函数原型(参数个数、参数类型) 对象成员 一个类的对象作为另一个类的数据成员 class X{ 类名1 成员名1 类名2 成员名2 …... }; 构造函数 X::X(参数表0):成员1(参数表1),成员2(参数表2) { …... } 建立X类对象时,先调对象成员的构造函数,然后才执行X类的构造函数 对象成员构造函数的调用顺序取决于这些对象成员在类中的说明顺序 析构函数的调用顺序与构造函数相反

文档评论(0)

1亿VIP精品文档

相关文档