《面向对象程序设计C++》课件1第3章 类和对象.ppt
《《面向对象程序设计C++》课件1第3章 类和对象.ppt》由会员分享,可在线阅读,更多相关《《面向对象程序设计C++》课件1第3章 类和对象.ppt(151页珍藏版)》请在文库网上搜索。
1、2023/12/21第第3章章 类和对象类和对象本章学习要点本章学习要点类和对象的概念及其关系类的声明和对象的定义及使用构造函数与析构函数的作用及使用对象数组 对象与指针 对象与const对象的动态创建和释放对象的复制和赋值 对象的移动向函数传递对象字面值常量类图书馆图书借阅管理系统中类的声明和对象的定义2023/12/22第第3章章 类和对象类和对象本章学习目标本章学习目标正确理解类、对象及封装的概念熟练掌握类的声明和对象的定义及使用理解构造函数与析构函数的作用及使用掌握对象与指针及const的特点及使用理解并掌握对象的复制和赋值,对象的移动掌握对象的动态创建和释放理解对象作为函数的参数传递
2、的实质掌握基本的基于对象的程序设计与实现2023/12/233.1 类的声明和对象的定义类的声明和对象的定义v本节主要是关于类和对象的概念、类的声本节主要是关于类和对象的概念、类的声明格式、对象的定义方法明格式、对象的定义方法 2023/12/243.1.1 类和对象的概念及关系类和对象的概念及关系v对象对象封装了数据及在这些数据之上的操作的封装了数据及在这些数据之上的操作的封装体封装体 v类类对具有相同属性和操作的一组对象的抽对具有相同属性和操作的一组对象的抽象描述象描述 v类和对象的关系类和对象的关系 类是对象的抽象;对象是对类的实例化类是对象的抽象;对象是对类的实例化2023/12/25
3、类和对象的关系类和对象的关系3.1.1 类和对象的概念及关系类和对象的概念及关系2023/12/263.1.2 类类的声明的声明class 类名类名public:公用成员公用成员 protected:受保护成员受保护成员 private:私有成员私有成员 ;声明类的一般形式:声明类的一般形式:声明类的关键字声明类的关键字合法标识符合法标识符公用成员限定符公用成员限定符受保护成员限定符受保护成员限定符私有成员限定符私有成员限定符类结束要加分号类结束要加分号2023/12/273.1.2 类类的声明的声明【例例3-1】声明一个学生类,要求包括学生的学号、声明一个学生类,要求包括学生的学号、姓名、性
4、别等信息,并且能够显示学生的信息。姓名、性别等信息,并且能够显示学生的信息。2023/12/283.1.2 类类的声明的声明class Student /声明学生类声明学生类Studentpublic:/以下部分为公用成员函数以下部分为公用成员函数 void setInfo()cout stuNo stuName stuSex stuAge;void show()cout No.:stuNo endl;cout Name:stuName endl;cout Sex:stuSex endl;cout Age:stuAge endl;private:/以下部分为学生类以下部分为学生类Student
5、的私有数据成员的私有数据成员string stuNo;/学号学号 string stuName;/姓名姓名 string stuSex=男男;/性别性别 int stuAge=0;/年龄年龄;/类声明结束,此处必须有分号类声明结束,此处必须有分号2023/12/293.1.2 类类的声明的声明1.类的成员分为数据成员和成员函数类的成员分为数据成员和成员函数2.成员的可访问性可分为三类:私有的(成员的可访问性可分为三类:私有的(private)、受保)、受保护的(护的(protected)、公用的()、公用的(public)3.由访问限定符限定它后面的成员的访问属性,直到出现下由访问限定符限定它
6、后面的成员的访问属性,直到出现下一个访问限定符或者类的结束为止一个访问限定符或者类的结束为止4.在声明类时,这三种访问属性的成员的声明次序是任意的,在声明类时,这三种访问属性的成员的声明次序是任意的,并且在一个类的声明中不一定这三种访问属性全部都出现,并且在一个类的声明中不一定这三种访问属性全部都出现,可能只出现两种或一种。可能只出现两种或一种。5.某个成员访问限定符在一个类的声明中也可以出现多次。某个成员访问限定符在一个类的声明中也可以出现多次。注意注意2023/12/2103.1.3 对象的定义对象的定义v声明类之后,再定义对象声明类之后,再定义对象如:如:Student zhang,wa
7、ng;或:或:class Student zhang,wang;v在声明类的同时定义对象在声明类的同时定义对象如:如:class Student zhang,wang;v不出现类名,直接定义对象不出现类名,直接定义对象如:如:class zhang,wang;声明类时系统并不分配内存单元,而定义对象声明类时系统并不分配内存单元,而定义对象时系统会给每个对象分配内存单元时系统会给每个对象分配内存单元2023/12/2113.2.1 成员函数的性质成员函数的性质v不属于任何类的函数称为不属于任何类的函数称为普通函数普通函数。v成员函数隶属于某个类成员函数隶属于某个类v成员函数与普通函数的区别成员函
8、数与普通函数的区别成员函数是属于某个类的成员函数是属于某个类的,是类的一个成员是类的一个成员成员函数可以指定访问属性成员函数可以指定访问属性成员函数可以访问本类的任何成员,而普通函成员函数可以访问本类的任何成员,而普通函数只能访问对象的公用成员数只能访问对象的公用成员v对于成员函数,对于成员函数,一般是将需要被类外调用一般是将需要被类外调用的声明为公用的,不需要被类外调用的声的声明为公用的,不需要被类外调用的声明为私有的。明为私有的。2023/12/212【例例3-4】将将Student类的成员函数改为在类外定义类的成员函数改为在类外定义的形式。的形式。3.2.2 在类外定义成员函数在类外定义
9、成员函数2023/12/213class Student/声明声明Student类类型类类型public:/以下部分为公用成员函数以下部分为公用成员函数 void setInfo();void show();private:/以下部分是私有数据成员以下部分是私有数据成员 int stuNo;/学号学号 char stuName20;/姓名姓名 string stuSex=男男;/性别性别 int stuAge=0;/年龄年龄;/类声明结束类声明结束/在类的声明之外定义成员函数在类的声明之外定义成员函数/在类的声明之外定义学生类在类的声明之外定义学生类Student的的setInfo成员函数成员
10、函数void Student:setInfo()cout stuNo stuName stuSex stuAge;2023/12/214class Student/声明声明Student类类型类类型public:/以下部分为公用成员函数以下部分为公用成员函数 void setInfo();void show();private:/以下部分是私有数据成员以下部分是私有数据成员 int stuNo;/学号学号 char stuName20;/姓名姓名 string stuSex=男男;/性别性别 int stuAge=0;/年龄年龄;/类声明结束类声明结束/在类的声明之外定义成员函数在类的声明之外
11、定义成员函数 void Student:show()coutNo.:stuNoendl;coutName:stuNameendl;coutSex:stuSexendl;cout Age:stuAge endl;2023/12/2153.2.2 在类外定义成员函数在类外定义成员函数(1 1)成员函数在类内定义或是在类外定义,对程序执行的)成员函数在类内定义或是在类外定义,对程序执行的效果基本一样。效果基本一样。(2 2)在类外定义成员函数时,必须首先在类内写出成员函)在类外定义成员函数时,必须首先在类内写出成员函数的原型,然后再在类外定义数的原型,然后再在类外定义。(3 3)如果在类外有函数定义
12、,但是在函数名前没有类名和)如果在类外有函数定义,但是在函数名前没有类名和作用域运算符进行限定,则该函数被认为是普通函数。作用域运算符进行限定,则该函数被认为是普通函数。(4 4)如成员函数的函数体很短,也可以将其定义在类内。)如成员函数的函数体很短,也可以将其定义在类内。(5 5)在类内声明成员函数,在类外定义成员函数,是软件)在类内声明成员函数,在类外定义成员函数,是软件工程中要求的良好的编程风格工程中要求的良好的编程风格。注意注意2023/12/2163.2.3 inline成员函数成员函数vinline函数函数在编译时将被调用函数的代码直接嵌入在编译时将被调用函数的代码直接嵌入到调用函
13、数处到调用函数处 vinline成员函数就是将类中的成员函数成员函数就是将类中的成员函数声明为内置的声明为内置的 当类中的成员函数是在类内定义时,默当类中的成员函数是在类内定义时,默认该成员函数是认该成员函数是inline成员函数成员函数 如果成员函数定义在类的外部,则在成如果成员函数定义在类的外部,则在成员函数声明或定义前必须要有员函数声明或定义前必须要有inline关键关键字字 2023/12/2173.2.4 成员函数的存储方式成员函数的存储方式v实例化对象时需要分配内存空间,数据和函实例化对象时需要分配内存空间,数据和函数都需要存储空间数都需要存储空间v同一个类的不同对象的数据是不一样
14、的,因同一个类的不同对象的数据是不一样的,因此要为每个对象的数据成员分配内存单元此要为每个对象的数据成员分配内存单元v同一个类的不同对象的函数是一样的,因此同一个类的不同对象的函数是一样的,因此将同类的所有对象的函数放在一个公共的区将同类的所有对象的函数放在一个公共的区域。域。2023/12/2183.2.4 成员函数的存储方式成员函数的存储方式【例例3-5】类的对象占用内存空间实验。类的对象占用内存空间实验。#include using namespace std;class Testpublic:void show()coutchar in Test is:cendl;private:ch
15、ar c;int main()Test test;coutSize of Test is sizeof(test)endl;return 0;2023/12/2193.2.4 成员函数的存储方式成员函数的存储方式【例【例3-6】相同类的不同对象执行相同成员函数输出相同类的不同对象执行相同成员函数输出不同结果。不同结果。#include using namespace std;class Testpublic:void set(char ch)c=ch;void show()coutchar in Test is:cc=ch;void show(Test*this)coutchar in Tes
16、t is:c”运算符方便直观的进行,运算符方便直观的进行,“-”称为指向运算符。称为指向运算符。例如:例如:Test test1;test1.set(a);Test*pTest=&test1;test1.show();pTest-show();此处两个语句的执行结此处两个语句的执行结果完全相同,只是采用果完全相同,只是采用了不同的访问对象成员了不同的访问对象成员的形式而已的形式而已。2023/12/2243.3.3 通过引用访问成员通过引用访问成员v对象的引用和普通变量的引用在本质上是一样对象的引用和普通变量的引用在本质上是一样的的 v通过对象的引用访问对象成员和通过对象访问通过对象的引用访问
17、对象成员和通过对象访问成员形式上是一样的成员形式上是一样的例如:例如:Test test1;test1.set(a);Test&refTest=test1;test1.show();refTest.show();此处两个语句的执行结此处两个语句的执行结果完全相同,只是采用果完全相同,只是采用了不同的访问对象成员了不同的访问对象成员的形式而已的形式而已。class Student/声明声明Student类类型类类型public:/以下部分为公用成员函数以下部分为公用成员函数 void setInfo();void show();private:/以下部分是私有数据成员以下部分是私有数据成员 in
18、t stuNo;/学号学号 char stuName20;/姓名姓名 string stuSex=男男;/性别性别 int stuAge=0;/年龄年龄;/类声明结束类声明结束/在类的声明之外定义成员函数在类的声明之外定义成员函数 void Student:show()coutNo.:stuNoendl;coutName:stuNameendl;coutSex:stuSexendl;cout Age:stuAge endl;2023/12/225int main()Student stud;stud.show();return 0;2023/12/226class Student/声明声明St
19、udent类类型类类型public:/以下部分为公用成员函数以下部分为公用成员函数 void setInfo();void show();private:/以下部分是私有数据成员以下部分是私有数据成员 int stuNo;/学号学号 char stuName20;/姓名姓名 string stuSex=男男;/性别性别 int stuAge=0;/年龄年龄;/类声明结束类声明结束/在类的声明之外定义成员函数在类的声明之外定义成员函数 void Student:Show()coutNo.:stuNoendl;coutName:stuNameendl;coutSex:stuSexendl;void
20、 Student:setInfo()cout stuNo stuName stuSex stuAge;int main()Student stud;stud.setInfo();stud.show();return 0;2023/12/2273.4.1 构造函数构造函数1、构造函数的任务、构造函数的任务 创建对象时对对象的数据成员初始化创建对象时对对象的数据成员初始化【例【例3-9】构造函数举例构造函数举例2023/12/228class SalesData /声明图书交易记录类SalesDatapublic:/定义SalesData类的构造函数,构造函数名与类名相同 SalesData()/
21、利用构造函数对数据成员赋初值 bookNo=null;unitsSold=0;revenue=0.0;cout SalesDatas constructor is executed!endl;private:string bookNo;/书号书号 int unitsSold;/销售出的册数销售出的册数 double revenue;/总销售金额总销售金额;/类声明结束类声明结束2023/12/2293.4.1 构造函数构造函数v构造函数的特点构造函数的特点(1)构造函数是类的一个特殊的成员函数,构造函数名与)构造函数是类的一个特殊的成员函数,构造函数名与类名相同,且没有返回值类名相同,且没有返
22、回值(2)构造函数可以被重载,一个类可以包含多个构造函数,)构造函数可以被重载,一个类可以包含多个构造函数,不同的构造函数之间在形参数量或形参类型上有所不同。不同的构造函数之间在形参数量或形参类型上有所不同。稍后介绍。稍后介绍。(3)构造函数不需要用户调用,由系统在创建对象时自动)构造函数不需要用户调用,由系统在创建对象时自动调用的调用的(4)构造函数不能声明为)构造函数不能声明为const的。的。(5)构造函数内容一般是初始化数据语句,但也可以是其)构造函数内容一般是初始化数据语句,但也可以是其他的语句他的语句(6)创建对象时肯定会执行一个构造函数)创建对象时肯定会执行一个构造函数2023/
23、12/2303.4.1 构造函数构造函数v默认构造函数默认构造函数 如果用户自己没有定义构造函数,编译器会隐式地如果用户自己没有定义构造函数,编译器会隐式地提供一个构造函数,称之为合成的默认构造函数,提供一个构造函数,称之为合成的默认构造函数,该构造函数的形参表和函数体皆为空,它按如下规该构造函数的形参表和函数体皆为空,它按如下规则初始化类的数据成员:则初始化类的数据成员:v如果存在类内的初始值,用它来初始化成员,这是如果存在类内的初始值,用它来初始化成员,这是C+11标准中新增的类内初始化。标准中新增的类内初始化。v否则,默认初始化该成员,其初始化规则与普通变否则,默认初始化该成员,其初始化
24、规则与普通变量的默认初始化规则相同。量的默认初始化规则相同。2023/12/2313.4.1 构造函数构造函数v默认构造函数默认构造函数 合成的默认构造函数只适合非常简单的类,对于大合成的默认构造函数只适合非常简单的类,对于大多数普通的类来说,必须定义它自己的默认构造函多数普通的类来说,必须定义它自己的默认构造函数(该构造函数或者形参表为空,如例数(该构造函数或者形参表为空,如例3-9中的构中的构造函数,或者形参不为空但全部参数都有默认实参)造函数,或者形参不为空但全部参数都有默认实参)。2023/12/2323.4.1 构造函数构造函数2、定义自己的构造函数、定义自己的构造函数 class
25、SalesData /声明图书交易记录类SalesDatapublic:SalesData()=default;/无参的默认构造函数 /带1个const string&参数的构造函数 SalesData(const string&No):bookNo(No)/带1个istream&参数的构造函数 SalesData(istream&input);/带3个参数(书号、销售册数、销售价格)的构造函数 SalesData(const string&No,int n,double price):bookNo(No),unitsSold(n),revenue(n*price);/类声明结束类声明结束20
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 面向对象程序设计C+ 面向对象程序设计C+课件1第3章 类和对象 面向 对象 程序设计 课件