第三章 C++ 面向对象基础

38
第第第 第第第 C++ C++ 第第第第第第 第第第第第第 3.1 第第 一、 C++ 第第第第第 C 第第第第第第第 第第第第第第第 第第第第第第第第第第第第第 第第第第第第第第第 第第第第 第第第 、一一。 第第第第第第第第第第第第 第第第第第第第第 第 第第第第第 ,一体, 第第第第第第第第第第 第 第第第第第第第第第第第第 第 第第 、,一,一 第第第第第第第第第第 第第 第第第第 第第第第第第第第第第 ,。,一 第第第第第第第第第第第第第第第第第第第第第第第第第第 第 第第第 传统 第第 第第第第 一。 第第第第第第第第第第第第第 第第第第第第 、一。 第第第第第第第第第第第第 第第第第第第第第“第第第” 、一 第第第第第第第第第第第 第第 一。

description

3.1 概述 一、 C++ 不仅扩充了 C 面向过程的功能,而且增加了面向 对象的功能。 二、客观世界中任何一个事物都可以看成一个对象。作为对 象它至少应该包含两个因素,一是从事活动的主体,而是活动的 内容。 三、从计算机角度看,一个对象应该包含两个要素,一是数 据,二是需要进行的操作。即,对象是一个包含数据以及与这些 数据有关的操作的集合。 四、传统的面向过程的程序设计围绕功能进行,用一个函数 实现一个功能。 五、面向对象程序设计面对的是一个个的对象。 - PowerPoint PPT Presentation

Transcript of 第三章 C++ 面向对象基础

Page 1: 第三章   C++ 面向对象基础

第三章 第三章 C++C++ 面向对象基础面向对象基础3.1 概述 一、 C++ 不仅扩充了 C 面向过程的功能,而且增加了面向对象的功能。 二、客观世界中任何一个事物都可以看成一个对象。作为对象它至少应该包含两个因素,一是从事活动的主体,而是活动的内容。 三、从计算机角度看,一个对象应该包含两个要素,一是数据,二是需要进行的操作。即,对象是一个包含数据以及与这些数据有关的操作的集合。 四、传统的面向过程的程序设计围绕功能进行,用一个函数实现一个功能。 五、面向对象程序设计面对的是一个个的对象。 六、面向对象程序设计方法的一个重要的特点就是“封装性”把数据和操作代码封装在一起。

Page 2: 第三章   C++ 面向对象基础

3.2 类和对象 一、对象:每一个实体都是对象。 二、类:用来定义对象的一种抽象数据类型,它是产生对象的模板。它的性质和其他数据类型相同。 三、类的声明:1 、声明一个结构体类型: struct student {

int num;char name[20];char sex;

};struct student stu1,stu2;

Page 3: 第三章   C++ 面向对象基础

2 、声明一个类class stud // 以 class 开头 { int num;char name[20];char sex; // 以上 3 行是数据成员void display(){ cout<<“num:”<<num<<endl;cout<<“name:”<<name<<endl;cout<<“sex:”<<sex<<endl;} // 以上是操作代码};stud stud1,stud2; // 定义了两个类的对象 四、类的成员包括两大类:一类是“私有的”( private);一类是“公有的”( public)

Page 4: 第三章   C++ 面向对象基础

将上面类的声明改为:class stud{ private: // 声明以下部分为私有的int num;char name[20];char sex;public: // 声明以下部分为公有的void display(){ cout<<“num:”<<num<<endl;cout<<“name:”<<name<<endl;cout<<“sex:”<<sex<<endl;}};stud stud1,stud2; // 定义了两个类的对象

Page 5: 第三章   C++ 面向对象基础

五、几个名词:1 、方法:对数据的操作。2 、消息:一个命令,由程序语句来实现。外界通过法送“消息”来激活有关的方法。 如: stud1.display(); 六、类声明的一般形式: class 类名 {

private:私有的数据和成员函数;public:公有的数据和成员函数;

} ;

Page 6: 第三章   C++ 面向对象基础

3.3 构造函数和析构函数一、构造函数1 、构造函数的含义:在建立一个对象时,常常需要作某些初始化工作, C++ 提供了一种特殊的成员函数 --- 构造函数来实现。 ( 1 )该函数不需用户发送“消息”来激活它,而是在建立对象时自动执行,而且只能执行一次。 ( 2 )构造函数由用户定义,必须与类名同名。 ( 3 )构造函数一般声明为 public ,无返回值,也不需加 void类型声明。

Page 7: 第三章   C++ 面向对象基础

例 1 、创建一个对象,输出学生的学号、姓名、性别#include <string.h>#include <iostream.h>void main(){ class stud { private: int num; char name[20]; char sex; public: stud(){ num=1010;strcpy(name,”wangw”);sex=‘F’;}

Page 8: 第三章   C++ 面向对象基础

void display(){ cout<<“num:”<<num<<endl;cout<<“name:”<<name<<endl;cout<<“sex:”<<sex<<endl;} }; stud stud1; stud1.display();}说明:( 1 )程序包括三部分:声明一个类;定义一个对象;向对象发出消息,执行对象中的成员函数 display 。( 2 )在定义 stud1 对象时自动执行了构造函数 stud() 。( 3 )输出信息: num:1010name:wangwsex:F

cout<<stud1.name;

Page 9: 第三章   C++ 面向对象基础

2 、带参数的构造函数如: stud(int n,char nam[],char s) { num=n; strcpy(name,nam); sex=s; }实参在建立对象时给出:如: stud stud1(1010,”wang_w”,”f”), stud2(1012,”fen”,’m’);

Page 10: 第三章   C++ 面向对象基础

3 、构造函数的重载如:如: stud(int n,char nam[],char s)stud(int n,char nam[],char s) {{ num=n;num=n; strcpy(name,nam);strcpy(name,nam); sex=s;sex=s; }} stud()stud(){{ num=1020;num=1020; strcpystrcpy (( name,”lili”);name,”lili”); sex=‘f’;sex=‘f’;}} 建立对象时允许有实参和无实参:建立对象时允许有实参和无实参:如: 如: stud stud1,stud2(1012,”fen”,’m’);stud stud1,stud2(1012,”fen”,’m’);

Page 11: 第三章   C++ 面向对象基础

4、构造函数可以不定义,编译系统自动生成一个构造函数,该函数没有参数,也不进行任何操作。二、析构函数11 、析构函数的说明:、析构函数的说明:(( 11 )、析构函数与构造函数相反,当对象脱离作用域时,系统自)、析构函数与构造函数相反,当对象脱离作用域时,系统自动执行析构函数。动执行析构函数。(( 22 )、析构函数与类名相同,只是在函数名前面加上一个波浪)、析构函数与类名相同,只是在函数名前面加上一个波浪符符 ~~,如 ,如 ~stud()~stud() ,以区别于构造函数。,以区别于构造函数。(( 33 )、它不带任何参数,也没有返回值。)、它不带任何参数,也没有返回值。(( 44)、析构函数不能重载。)、析构函数不能重载。(( 55)、如果用户没有编写析构函数,编译系统会自动生成一个)、如果用户没有编写析构函数,编译系统会自动生成一个缺省的析构函数,它也不进行任何操作。缺省的析构函数,它也不进行任何操作。

Page 12: 第三章   C++ 面向对象基础

例 2 、包含构造函数和析构函数的 C++ 程序。#include <string.h>#include <iostream.h>class stud { private: int num; char name[20]; char sex; public: stud(int n,char nam[],char s){ num=n;strcpy(name,nam);sex=s;} ~stud() {}

Page 13: 第三章   C++ 面向对象基础

void display(){ cout<<“num:”<<num<<endl;cout<<“name:”<<name<<endl;cout<<“sex:”<<sex<<endl;} };void main(){ stud stud1(1010,”Wubin”,’m’); stud1.display();}

Page 14: 第三章   C++ 面向对象基础

三、成员函数的声明与定义分离 在类中只进行成员函数的声明,在类的外面定义成员函数。

例 3 、在类的外面定义成员函数。#include <string.h>#include <iostream.h>class stud { private: int num; char name[20]; char sex; public: stud(int n,char nam[],char s) ; ~stud() ; void display(); };

Page 15: 第三章   C++ 面向对象基础

stud::stud(int n,char nam[],char s){ num = n; strcpy(name,nam); sex =s;}stud::~stud(){}void stud::display(){ cout<<“num:”<<num<<endl;cout<<“name:”<<name<<endl;cout<<“sex:”<<sex<<endl;}void main(){ stud stud1(1010,”Wubin”,’m’); stud1.display();}

Page 16: 第三章   C++ 面向对象基础

说明:1 、在类声明的外部定义的函数,必须指定类名,形式为 : 函数类型 类名::函数名(形参表列)不要写成: void display() //未指定类名 stud::void display() // 函数类型位置不对2 、 stud::display() 是一个整体。3 、可以将在类外部定义的函数声明为“内置函数”。如: inline void stud::display()

Page 17: 第三章   C++ 面向对象基础

3.3 继承与派生一、继承与派生的概念1 、面向对象技术强调软件的可重用性,在 C++ 中通过“继承”机制实现可重用性。2 、继承就是在已存在的类的基础上建立一个新的类。已存在的类称为“基类”或“父类”,新建立的类称为“派生类”或“子类”。3 、派生类继承了基类的所有数据成员和成员函数,并增加了新的成员。

Page 18: 第三章   C++ 面向对象基础

如:声明学生基本数据的类 studclass stud{private:int num;char name[20];char sex;public:void display(){ cout<<"num:"<<num<<endl;cout<<"name:"<<name<<endl;cout<<"sex:"<<sex<<endl;}};

Page 19: 第三章   C++ 面向对象基础

学校某部门除了需要学生基本数据外,还需要年龄信息 , 定义类stud_1class stud_1{private:int num;char name[20];char sex; //前 3 行原来已有int age;public:void display(){ cout<<"num:"<<num<<endl;cout<<"name:"<<name<<endl;cout<<"sex:"<<sex<<endl; //前 3 行原来已有cout<<“age:”<<age<<endl;}};

Page 20: 第三章   C++ 面向对象基础

二、建立派生类的方法1 、例 4:通过继承来建立派生类在基类 stud 的基础上,声明一个派生类 student:class student:public stud{ private: int age; public: void display_1() { cout<<“age:”<<age<<endl;}};

Page 21: 第三章   C++ 面向对象基础

说明:( 1 ) class后的 student 为新建的类名;( 2 )冒号后面的 stud表示已存在的基类;( 3 )在 stud之前有一关键字 public ,用来表示基类 stud 中的成员在 student 中的使用权限。2 、定义派生类的一般形式为:class 派生类名: [引用权限 ] 基类名{ 派生类新增加的数据成员; 派生类新增加的成员函数;} ;

Page 22: 第三章   C++ 面向对象基础

三、公用派生类1 、在声明一个派生类时将基类的引用权限指定为 public 的,该类称为基类的公用派生类。

基类 私有成员 公用成员 公用派生类 不可访问的成员 公用成员

公用派生类的继承关系

Page 23: 第三章   C++ 面向对象基础

如: class stud // 声明基类{private: // 基类的私有成员int num;char name[20];char sex;public: // 基类的公用成员void display() { cout<<"num:"<<num<<endl;cout<<"name:"<<name<<endl;cout<<"sex:"<<sex<<endl;}};

Page 24: 第三章   C++ 面向对象基础

class student:public stud // 声明一个公用派生类{ private: int age; public: void display_1(){cout<<“age:”<<age<<endl; //引用派生类的私有成员cout<<“num:”<<num<<endl; //错误,引用基类的私有成员cout<<“name:”<<name<<endl;//错误,引用基类的私有成员}};

Page 25: 第三章   C++ 面向对象基础

可以通过引用基类的公用成员函数来引用基类的私有数据成员class student:public stud // 声明一个公用派生类{ private: int age; public: void display_1(){ display(); //引用基类的公用成员函数 cout<<“age:”<<age<<endl; //引用派生类的私有成员}};

Page 26: 第三章   C++ 面向对象基础

使用派生类定义对象:main(){ student a; // 定义了一个 student 类的对象 a.display_1(); // 输出 a 对象的 4的数据}主函数中如果出现如下语句: a.display(); //正确。继承公用成员函数。 a.age = 10; //错误。外界不能引用派生类的私有成员 a.num = 1010; //错误。外界不能引用基类的私有成员

Page 27: 第三章   C++ 面向对象基础

四、私有派生类1 、在声明一个派生类时将基类的引用权限指定为 private 的,该类称为基类的私有派生类。

基类 私有成员 公用成员 私有派生类 不可访问的成员 私有成员

私有派生类的继承关系

Page 28: 第三章   C++ 面向对象基础

class student:private stud // 声明一个私有派生类{ private: int age; public: void display_1(){ display(); // 基类的公用成员函数变成派生类的私有函数 cout<<“age:”<<age<<endl; //引用派生类的私有成员}};

Page 29: 第三章   C++ 面向对象基础

使用派生类定义对象:main(){ student a; // 定义了一个 student 类的对象 a.display_1(); // 输出 a 对象的 4的数据}主函数中如果出现如下语句: a.display(); //错误。基类的公用成员函数变成派生类// 的私有函数,外界不能引用。 a.age = 10; //错误。外界不能引用派生类的私有成员 a.num = 1010; //错误。外界不能引用基类的私有成员因此:( 1 )不能通过私有派生类的对象引用从基类继承过来的任何成员( 2 )派生类的成员函数中不能访问基类的私有成员,但可以访问基类的公用成员。

Page 30: 第三章   C++ 面向对象基础

五、保护成员1 、由 protected 声明的成员称为保护成员。保护成员不能被外界引用,但可以被派生类的成员函数引用。

基类 私有成员 公用成员 保护成员 公用派生类 不可访问的成员 公用成员 保护成员 私有派生类 不可访问的成员 私有成员 私有成员

派生类的继承关系

Page 31: 第三章   C++ 面向对象基础

如: class stud // 声明基类{protected: // 基类的保护成员int num;char name[20];char sex;public: // 基类的公用成员void display() { cout<<"num:"<<num<<endl;cout<<"name:"<<name<<endl;cout<<"sex:"<<sex<<endl;}};

Page 32: 第三章   C++ 面向对象基础

class student:public stud // 声明公用派生类{ private:int age; public: void display_1() { cout<<“age:”<<age<<endl; //引用派生类私有成员 cout<<“num:”<<num<<endl; //引用基类的保护成员 cout<<"name:"<<name<<endl;}};void main(){ student a; a.display_1(); // 合法。 a.num = 1030; // 错误:外界不能访问保护成员}

Page 33: 第三章   C++ 面向对象基础

六、派生类的构造函数1 、创建派生类的对象时,系统只执行派生类的构造函数,而不会自动执行基类的构造函数,即,基类的构造函数时不能被继承的。2 、考虑基类的变量初始化,在执行派生类的构造函数时,应当调用基类构造函数。例 5:派生类的构造函数#include <string.h>#include <iostream.h>class stud {protected: int num; char name[20]; char sex;

Page 34: 第三章   C++ 面向对象基础

public: stud(int n,char nam[],char s) { num=n;strcpy(name,nam);sex=s; } ~stud() ;};class student:public stud // 声明公用派生类{ private:int age; public: student(int n,char nam[],char s,int a):stud(n,nam,s) { age=a; // 只对派生类新增的变量初始化 } void display_1() { cout<<“age:”<<age<<endl; //引用派生类私有成员 cout<<“num:”<<num<<endl; //引用基类的保护成员 cout<<"name:"<<name<<endl; }

Page 35: 第三章   C++ 面向对象基础

~student(); //派生类的析构函数}void main(){ student a(1020,”liyang”,’f’,19); a.display_1(); // 输出学生的数据}

派生类构造函数首部的写法:派生类构造函数名(参数表列):基类构造函数名(参数表列)student a(1020, ”liyang” ,’f’, 19);student (int n,char nam[],char s,int a):stud(n,nam,s)

Page 36: 第三章   C++ 面向对象基础

3 、在派生类声明中只声明构造函数:student(int n,char nam[],char s,int a):在类的外面定义派上类构造函数:

student::student(int n,char nam[],char s,int a):stud(n,nam,s) { age=a; // 只对派生类新增的变量初始化 }

Page 37: 第三章   C++ 面向对象基础
Page 38: 第三章   C++ 面向对象基础