面向对象程序设计的概念

上传人:san****019 文档编号:70268611 上传时间:2019-01-16 格式:PPT 页数:46 大小:333.81KB
返回 下载 相关 举报
面向对象程序设计的概念_第1页
第1页 / 共46页
面向对象程序设计的概念_第2页
第2页 / 共46页
面向对象程序设计的概念_第3页
第3页 / 共46页
面向对象程序设计的概念_第4页
第4页 / 共46页
面向对象程序设计的概念_第5页
第5页 / 共46页
点击查看更多>>
资源描述

《面向对象程序设计的概念》由会员分享,可在线阅读,更多相关《面向对象程序设计的概念(46页珍藏版)》请在金锄头文库上搜索。

1、第二章 面向对象程序设计的概念,C与C+的差别 引用 类和对象 构造函数和析构函数,C对C的改进,一般语法的改进 指针和引用 函数的改进,C的输入和输出,include “stdio.h” printf(“hello c”); scanf(“%d”,#include”iostream.h” cout sum; cout “sum is ” sum endl;,一般语法的改进,注释,/*.*/ /,一般语法的改进,变量定义,变量定义可以位于程序中的任何地方,下面的语句有问题吗? for( int i=0; i10; i+) int c; c*=2; int s; ,一般语法的改进,符号常量的定义

2、,define NULL 0 #define Length 100 #define PI 3.1415926 const int NULL=0 const int Length =100 const double PI=3.1415926,一般语法的改进,强制转换类型,C的强制类型转换法 (类型名)表达式 函数表示法(仅限简单类型) 类型名(表达式) int i=int(1.35);,一般语法的改进,结构体与枚举类型的用户标识名,enum traffic red,green,yellow; struct student int num; char name20; traffic Light;

3、student stu1;,!不必在一个结构体名之前加struct,不用在一个枚举类型名之前加关键字enum。,一般语法的改进,动态内存分配,new int*p,*q,*s; p=new int; s=new int(200); q=new int10; delete delete p; delete q;,一般语法的改进,#include “iostream.h” void main() int *p; p=new int; *p=10; cout*p; delete p; ,引用类型的概念,引用是指给对象的地址取个别名,对引用的改动则是对目标的改动。 int int1; int 引用不是值

4、,不占有存储空间 引用必须初始化,并且不再指向其他不同的变量,指针和引用,什么能被引用,double ,指针和引用,什么不能被引用,void ,指针和引用,引用作为函数参数-地址传递,指针的代码可读性差,指针作为参数传递,用户调用知道函数是如何工作的。 解决大对象值传递会产生副本的问题 程序清单2-3,指针和引用,引用作为函数参数-地址传递,存在的问题 引用隐藏了函数所使用的参数传递的类型,应避免重载匹配错误 void fn(int s); void fn(int 用const 限定引用 double fn(const double &pd),指针和引用,函数原型,例: int func(in

5、t,int); C+ 要求所有函数都有函数原型 程序的顶部 头文件 C提供更强的类型检查,允许编译程序对下列情况报错误信息: 被调用函数参数类型定义和类型转换非法 函数的参数个数不相符 函数不能返回预定的数据类型,函数的改进,内置函数inline,#include void main() int a(8),b(16),c; inline int max(int,int); c=max(a,b); cout”c=”cendl; int max(int x,int y); cout”c=”cendl; ,内置函数inline,实质: 编译器为inline 函数创建代码,在每次碰到该函数的调用都用相

6、应的一段代码替换 说明: 关键字inline一般放在函数声明的前面 inline放在函数定义的前面时,函数定义要在调用函数的前面 限制: 不能含有switch,while等复杂的结构控制语句,递归函数不能被用作inline函数,函数的改进,inline 与宏定义,宏所作的是机械代换,在参数为表达式时会产生不可预知的错误 宏不能作类型检查 define f(m) m*m 宏定义调用:f(5+5) 5+5*5+5,函数的改进,函数的默认参数,可以在函数声明时,对参数赋与默认值,调用没有给出实参时,就使用默认值。 void delay(int loops=1000); void delay(int

7、loops) if (loops=0) return; for(int i=0;iloops;i+); delay(); delay(5000);,函数的改进,默认参数的使用说明,默认参数只能在函数声明中提供 若一个函数有多个默认参数,则在形参分布中从右到左逐个定义,在调用函数时,自左向右逐分配实参。 默认值可以是全局变量,常量,甚至一个函数,但不能是局部变量。,分析下面语句的正确性: void func(int a=1,int b,int c=3,int d=4); void func(int a,int b=2,int c=3,int d=4); func(10,15,20,30); fu

8、nc(); func(12,12); func(2,15,20);,函数的改进,重载函数,函数具有相同的名字,但有不同的参数,完成不同的操作 int abs(int i); long abs(long g ); double abs(double d);,函数的改进,重载函数说明,重载函数至少在参数的个数、参数的类型、或参数的顺序上有所不同 不能用typedef 的类型名区分重载函数中的参数 typedef int Length; void func(int ); void func(Length); 让重载函数执行不同的功能,是不好的编程风格。,函数的改进,避免二义性编译错误,void pr

9、int(long) void print(double) 调用: void func(int a) print(a); ,函数的改进,类和对象,类: 由用户定义的,将一组具有相关性的数据和操作封装在一起的抽象数据类型。数据称为数据成员,操作称为成员函数。 对象: 用类定义的变量,类和对象,类的定义 对象的定义 构造函数和析构函数 this指针,类的定义,class 类名 private: 私有段数据及函数 protected: 保护段数据及函数 public: 公有段数据及函数 ; 省略时默认为private,成员访问类型,Point类的设计,class Point int x; int y;

10、 public: void set_x(int k)x=k; void set_y(int k)y=k; int get_x()return x; int get_y()return y; ;,成员函数的类型,构造函数 析构函数 普通成员函数 虚函数 注:除析构函数不能重载外,其他成员函数都是可以重载的,成员函数的实现,在类定义时实现 在类定义的外面实现 int Point:get_x() return x;,对象的定义,对象的定义 Point p1; Point *p; Point pa100; Point *parray100;,公有成员的使用,从类外访问公有段的数据成员或成员函数 对象名

11、.公有段数据成员 对象名.公有段成员函数(实参表) 类名:公有段数据成员 类名:公有段成员函数(实参表) 例 p1.x p1.y p1.set_x(20); x=p1.get_x(); p-x p-y pai.x pai.y,任务1,类和对象的定义 详见实验1,构造函数,构造函数的作用是构造对象初始化形式 在定义对象时,由应用程序自动调用 构造函数是类的一个特殊成员函数 它的函数名与类名相同, 没有返回类型 它可以有任意类型的参数 可以重载,默认构造函数,当类定义中没有用户定义的构造函数时,系统自动产生一个无参数的构造函数,称此构造函数为默认构造函数 当定义一个对象时,默认构造函数只是简单地把

12、对象中的每个成员初始化为0或空.,构造函数的类型,无参构造函数 Point(); Point p1; 带参构造函数 Point(int ,int); Point p2(100,200); 复制构造函数 Point(const Point,拷贝构造函数示例,class A public: A(int); A(const A ,析构函数,析构函数也是类的特殊成员函数,它的函数名与类名相同,但它的名字前面有一个“”.它没有参数,没有返回类型,而且不能重载.,this 指针,this 是一个指向调用该函数的对象的常量指针。 成员函数可通过this指针直接使用同类的其它成员 this指针是隐含的 int

13、 get_length()return length; int get_length()return this-length;,继承,在已有类的基础上定义新类的过程称为继承。 基类( base class)和派生类 派生类的定义 class : . . ,继承的方式,例2-22 单继承示例,多继承,派生类从多个基类派生,派生类具有多个基类的特性 派生方法: class 派生类名:继承方式1 基类名1,继承方式2 基类名2,.继承方式n 基类名n . . ;,例2-23 多继承示例,多态性,在 基类和派生类中使用同样的函数名而定义不同的操作,从而实现“一种接口,多种方法”。 类型 静态多态性: 编译时实现,通过重载 动态多态性: 运行时实现,通过派生和虚函数,虚函数,在继承体系中,如果在派生类中要对所继承的成员函数重新定义其功能,该函数应在基类中被定义为虚函数。 虚函数是指在基类中的成员函数前加上virtual,然后在派生类中再加以定义的函数。 当用指向派生类的对象的基类指针对函数进行访问时,系统将根据运行时指针所指向的实际对象来确定调用哪一个类的成员函数版本。,例2-25 虚函数示例,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号