高程——第一部分+C++基础_第1页
高程——第一部分+C++基础_第2页
高程——第一部分+C++基础_第3页
高程——第一部分+C++基础_第4页
高程——第一部分+C++基础_第5页
已阅读5页,还剩39页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、高级程序设计语言高级程序设计语言C+基础 授课教师:杨佳授课教师:杨佳 联系方式:联系方式: 课件密码:课件密码:yangjia类和对象初步认知类和对象初步认知u 类的定义类的定义l类定义格式类定义格式l成员函数的定义成员函数的定义 inline成员函数成员函数u 对象的定义与成员访问对象的定义与成员访问l成员函数的存储方式成员函数的存储方式this指针指针u 对象的初始化与释放对象的初始化与释放l构造函数与析构函数构造函数与析构函数l动态分配对象动态分配对象 类定义的格式类定义的格式 类定义的一般格式为:类定义的一般格式为: class 类名类名 private: 数据成员或成员函数数据成员

2、或成员函数 protected: 数据成员或成员函数数据成员或成员函数 public: 数据成员或成员函数数据成员或成员函数 ;在类外不能存取,只有类中在类外不能存取,只有类中的成员函数或友元可以访问的成员函数或友元可以访问(默认)(默认)可被程序中的任何函数或语可被程序中的任何函数或语句存取。多为成员函数,用句存取。多为成员函数,用来提供一个与外界的接口,来提供一个与外界的接口,外界只有通过这个接口才可外界只有通过这个接口才可以访问类。以访问类。不能在类之外存取,只有类不能在类之外存取,只有类的成员函数、友元及其派生的成员函数、友元及其派生类(子类)可以存取类(子类)可以存取protecte

3、d 成员。成员。类的定义实例类的定义实例class CStuScore public: / 公有类型声明公有类型声明 string m_strName; / 姓名姓名 string m_strStuNO; / 学号学号 void SetScore(float s0, float s1,float s2) ; / 设置三门课成绩设置三门课成绩 float GetAverage(); /求平均成绩求平均成绩 private: / 私有类型声明私有类型声明 float m_fScore; / 三门课程成绩三门课程成绩 ; / 注意分号不能省略注意分号不能省略类的定义注意事项类的定义注意事项定义类时还

4、应注意: (1) 在“public:”或“private:”后面成员都是公有或私有的,直到下一个“public:”或“private:”出现为止。 (2)关键字public和private在类中出现多次,前后的顺序没有关系。 (3)除了public和private外,关键字protected也可修饰成员的类型。 (4)数据成员的类型可以是任意的,包含整型、浮点型、字符型、数组、指针等。 (5)将类单独存放在一个文件中或将类的声明放在.h文件中而将成员函数的实现放在与.h文件同名的.cpp文件中。 成员函数的定义:可以直接写在类中(适合于函数成员函数的定义:可以直接写在类中(适合于函数体较小时)

5、,也可以在类定义中只给出函数原型,将函体较小时),也可以在类定义中只给出函数原型,将函数定义写在类定义之外。一般格式为:数定义写在类定义之外。一般格式为:返回值类型返回值类型 类名类名:成员函数名(形参表)成员函数名(形参表) 函数体;函数体; 成员函数的定义成员函数的定义: 作用域运算符,表示作用域运算符,表示该成员函数归某类所该成员函数归某类所有有inline成员函数成员函数 在类体中定义的成员函数的规模一般都很小,为了减少函在类体中定义的成员函数的规模一般都很小,为了减少函数调用的时间开销,数调用的时间开销,C+系统会自动将它们作为内联系统会自动将它们作为内联(inline)函数来处理函

6、数来处理,即把函数代码嵌入程序的调用点。,即把函数代码嵌入程序的调用点。 当类的成员函数规模很小,且不含有复杂的数据类型和语当类的成员函数规模很小,且不含有复杂的数据类型和语句,对类内定义的成员函数,可以省略句,对类内定义的成员函数,可以省略inline,因为这些成员函,因为这些成员函数已被隐含地指定为内联函数。数已被隐含地指定为内联函数。类的定义类的定义含成员函数的定义含成员函数的定义class CStuScore public: string m_strName; / 姓名姓名 string m_strStuNO; / 学号学号 void SetScore(float s0, float

7、s1,float s2) /在类中定义函数在类中定义函数 m_fScore0 = s0; m_fScore1 = s1; m_fScore2 = s2; float GetAverage();private: float m_fScore3; ; float CStuScore:GetAverage() /在类体外定义函数在类体外定义函数 return (float)(m_fScore0 + m_fScore1 + m_fScore2)/3.0); 对象的定义与成员访问对象的定义与成员访问 在程序中经常需要访问对象中的成员。访问对象在程序中经常需要访问对象中的成员。访问对象中的成员可以有中的成

8、员可以有3种方法:种方法: 通过通过对象名和成员运算符对象名和成员运算符访问对象中的成员访问对象中的成员; 通过通过指向对象的指针指向对象的指针访问对象中的成员访问对象中的成员; 通过通过对象的引用对象的引用变量访问对象中的成员。变量访问对象中的成员。1、对象的定义格式、对象的定义格式对象是类的实例,用类定义对象的一般格式为:对象是类的实例,用类定义对象的一般格式为:类名类名 对象名;对象名; 如如: CStuScore stuScore;2、对象成员的访问、对象成员的访问 对象名对象名.成员名成员名 如:如: stuScore.GetAverage(); 通过对象名和成员运算符访问对象中的成

9、员通过对象名和成员运算符访问对象中的成员通过指向对象的指针访问对象中的成员通过指向对象的指针访问对象中的成员1、对象指针的定义格式、对象指针的定义格式 类名类名 *对象指针名;对象指针名;如:如: CStuScore * pScore;2、对象成员的访问、对象成员的访问 对象指针名对象指针名-成员名成员名 或者或者 (*对象指针名对象指针名).成员名成员名 (对象指针必须指向某个已知对象)(对象指针必须指向某个已知对象) 如:如: CStuScore stuScore; pScore=&stuScore; pScore- GetAverage(); (*pScore). GetAverage(

10、);通过对象的引用变量来访问对象中的成员通过对象的引用变量来访问对象中的成员CStuScore stuScore;CStuScore &re_stuScore=stuScore;re_stuScore. GetAverage();注意:一个对象定义了一个引用变量,它们是共占同一段注意:一个对象定义了一个引用变量,它们是共占同一段存储单元的,实际上它们是同一个对象,只是用不同的名存储单元的,实际上它们是同一个对象,只是用不同的名字表示而已字表示而已#include #include using namespace std;class CStuScore public: string m_strN

11、ame; string m_strStuNO; void SetScore(float s0, float s1,float s2) m_fScore0 = s0; m_fScore1 = s1; m_fScore2 = s2; float GetAverage(); private: float m_fScore3; ; float CStuScore:GetAverage() return (float)(m_fScore0 + m_fScore1 + m_fScore2)/3.0); void main() CStuScore stuScore1,stuScore2,*pScore; p

12、Score=&stuScore1; CStuScore &reScore=stuScore2; pScore- SetScore(80,100,90); reScore.SetScore(90,100,95); coutstuScore1的平均分是:的平均分是:GetAverage()endl; coutstuScore2的平均分是:的平均分是:reScore.GetAverage()m_fScore0 = s0; this-m_fScore1 = s1; this-m_fScore2 = s2; reScore.SetScore(90,100,95);被编译为:被编译为:CStuScore

13、:SetScore(90,100,95, (CStuScore*)&reScore);此时此时 :this指向指向reScore首地址首地址(1)作用域运算符的功能是作用域运算符的功能是 A. 标示作用域的级别标示作用域的级别 B.指出作用域的范围指出作用域的范围 C. 给定作用域的大小给定作用域的大小 D.标识某个成员是属于哪个类的标识某个成员是属于哪个类的(2)下列说法中不正确的是下列说法中不正确的是A. 在类中,成员的默认访问权限是私有在类中,成员的默认访问权限是私有(private)的的;B. 类封装了数据和操作类封装了数据和操作;C. 类中数据类型可以是任意的;类中数据类型可以是任意

14、的;D. 在类的定义中必须包含在类的定义中必须包含private、public、protected三部分三部分DD概念巩固概念巩固(3)以下说法不正确的是:)以下说法不正确的是:A. 程序中可以定义指向某个类的对象的指针变量;程序中可以定义指向某个类的对象的指针变量;B. 类中的数据成员不能为指针类型;类中的数据成员不能为指针类型;C.成员函数必须在类体外定义成员函数必须在类体外定义 D. 当使用指针变量访问类的成员时,必须先使指针变量指向该当使用指针变量访问类的成员时,必须先使指针变量指向该 类的某个对象。类的某个对象。 (4) 下列说法不正确的是下列说法不正确的是 A.要在类的外部直接使用

15、类中的私有成员是错误的;要在类的外部直接使用类中的私有成员是错误的; B. 类的公有成员函数是类与外界的接口;类的公有成员函数是类与外界的接口; C. 在类的定义体中,决定成员访问权的符号在类的定义体中,决定成员访问权的符号private、public 和和protected在类体内出现的次序是一定的,且只能出现一次在类体内出现的次序是一定的,且只能出现一次; D. 类的封装机制实现了数据隐藏。类的封装机制实现了数据隐藏。BCC (5)下列说法中不正确的是:下列说法中不正确的是: A . 同一个类的两个对象占用相同的内存空间;同一个类的两个对象占用相同的内存空间; B .在类中不能对所定义的数

16、据成员进行初始化;在类中不能对所定义的数据成员进行初始化; C . 一个对象数组中的所有数组元素属于同一个类;一个对象数组中的所有数组元素属于同一个类; D . 当在类的外部定义成员函数时,必须在函数名前加上当在类的外部定义成员函数时,必须在函数名前加上 类名和类名和 作用域运算符作用域运算符“:”。 (6)下列说法中不正确的是下列说法中不正确的是 A. 对象是类的一个实例对象是类的一个实例 B. 任何一个对象必属于某个类任何一个对象必属于某个类 C. 一个类只能有一个对象一个类只能有一个对象 D. 类与对象间的关系,和数据类型与变量间的关系类似。类与对象间的关系,和数据类型与变量间的关系类似

17、。AC对象的初始化和释放对象的初始化和释放思考:思考:1、为什么要初始化?、为什么要初始化? 对象是一个实体,它反映了客观事物的属性,是应该有确对象是一个实体,它反映了客观事物的属性,是应该有确定的值。定的值。2、初始化的方式:、初始化的方式:注意:类的数据成员是不能在声明注意:类的数据成员是不能在声明 类时初始化的类时初始化的 1)若数据为公有成员)若数据为公有成员 可通过对象名、对象指针或引用在类外部直接赋初值。可通过对象名、对象指针或引用在类外部直接赋初值。 2)若数据为)若数据为private或或protected成员:成员: 可以通过调用成员函数赋初值可以通过调用成员函数赋初值 前两

18、种存在的弊端:不希望在类外部赋初值,程序员很前两种存在的弊端:不希望在类外部赋初值,程序员很可能忘记赋初值。可能忘记赋初值。 3)构造函数的好处)构造函数的好处 程序结构更清晰程序结构更清晰;专款专用:目的明确,专门对对象进行专款专用:目的明确,专门对对象进行初始化初始化;在对象第一次使用前初始化。在对象第一次使用前初始化。 构造函数(构造函数(constructor)1.与类同名与类同名,是类的一个特殊的是类的一个特殊的成员函数。成员函数。2.构造函数构造函数不能有返回值不能有返回值,因而因而不能指定包括不能指定包括void在内在内的任何返回值类型的任何返回值类型。3.当当使用该类定义对象使

19、用该类定义对象时,时,构造函数将构造函数将被系统自动调用被系统自动调用。class CStuScore public: CStuScore();void SetScore(.) ;float GetAverage(); ; class CStuScore public: CStuScore() m_strName=; m_strStuNO=; stringm_strName;/ 姓名姓名stringm_strStuNO; / 学号学号;带参数的构造函数带参数的构造函数class CStuScore public:CStuScore(string name) / 第一个构造函数第一个构造函数 m

20、_strName=name; CStuScore(string name, string NO) / 第二个构造函数第二个构造函数 m_strName=name; m_strStuNO=NO; string m_strName; string m_strStuNO; .;class CStuScore public: /利用默认参数的构造函数,简化类定义利用默认参数的构造函数,简化类定义 CStuScore(string name=, string NO=11111111) m_rName=name; m_strStuNO=NO; string m_strName; string m_strS

21、tuNO;.;用参数初始化表对数据成员初始化CStuScore(string name=, string NO=11111111) m_strName=name; m_strStuNO=NO; 等价于:等价于:CStuScore(string name=, string NO=11111111) :m_strName(name),m_strStuNO(NO) #include #include using namespace std;class CStuScore public: CStuScore(string name=student, string NO=11111111) m_strN

22、ame=name; m_strStuNO=NO; void SetScore(float s0, float s1,float s2); / 设置三门课成绩设置三门课成绩 float GetAverage();public: string m_strName; string m_strStuNO; private: / 私有类型声明私有类型声明 float m_fScore3; / 三门课程成绩三门课程成绩 ;Ex1.h文件文件#include Ex1.hvoid CStuScore:SetScore(float s0, float s1,float s2) / 设置三门课成绩设置三门课成绩

23、m_fScore0 = s0; m_fScore1 = s1; m_fScore2 = s2; float CStuScore:GetAverage() return (float)(m_fScore0 + m_fScore1 +m_fScore2)/3.0); void main() CStuScore Score1(LiMing, 21020501); Score1.SetScore(80,90,70); CStuScore Score2(zhangxiao); Score2.SetScore(99,90,85); coutScore1.m_strName 平均成绩平均成绩Score1.G

24、etAverage()endl; coutScore2.m_strName 平均成绩平均成绩Score2.GetAverage()endl;Ex1.cpp文件文件默认构造函数默认构造函数(default constructor) 默认构造函数是指不需要用户指定实参就能够被调用的构默认构造函数是指不需要用户指定实参就能够被调用的构造函数。一个类只能有一个默认构造函数。造函数。一个类只能有一个默认构造函数。 CStuScore() /第一种类型第一种类型 CStuScore() m_strName=; CStuScore(string name= , string NO=11111111) 默认函

25、数可由用户定义。如果在一个类体中,用户没有定默认函数可由用户定义。如果在一个类体中,用户没有定义任何构造函数,系统会自动创建一个隐式默认构造函数(结义任何构造函数,系统会自动创建一个隐式默认构造函数(结构如第一种类型),仅是对象创建语法需要。构如第一种类型),仅是对象创建语法需要。拷贝构造函数拷贝构造函数1、同类对象赋值、同类对象赋值 对象名对象名1 =对象名对象名2; 用一个类对象初始化该类的另一个对象被称为缺省按成用一个类对象初始化该类的另一个对象被称为缺省按成员初始化员初始化(default memberwise initialization)。 在概念上一个类对象向该类的另一个对象作拷

26、贝是通过依在概念上一个类对象向该类的另一个对象作拷贝是通过依次拷贝每个非静态数据成员来实现的。次拷贝每个非静态数据成员来实现的。void main() CStuScore Score1(LiMing, 21020501); Score1.SetScore(80,90,70); CStuScore Score2=Score1; coutScore1.m_strStuNO 的平均成绩为的平均成绩为Score1.GetAverage()endl; coutScore2.m_strStuNO 的平均成绩为的平均成绩为Score2.GetAverage()endl;2021020501的平均成绩为的平均

27、成绩为8021020501的平均成绩为的平均成绩为80同类对象赋值的探讨同类对象赋值的探讨 缺省按成员的初始化对于类的正确行为常常是不合适的缺省按成员的初始化对于类的正确行为常常是不合适的 如上例如两个对象有相同的学号如上例如两个对象有相同的学号 解决的方法:解决的方法: 拷贝构造函数拷贝构造函数 通过定义拷贝构造函数的显式实例我们可以改变缺省的行为通过定义拷贝构造函数的显式实例我们可以改变缺省的行为 拷贝构造函数定义的一般形式:拷贝构造函数定义的一般形式: 类名(类名(const 类名类名 &对象)对象) 调用时的一般形式:调用时的一般形式: 类名类名 对象对象2(对象(对象1););CSt

28、uScore(const CStuScore & score) for(int i=0;i3;i+) m_fScorei=score.m_fScorei; void main() CStuScore Score1(LiMing, 21020501); Score1.SetScore(80,90,65); CStuScore Score2(Score1); coutScore1.m_strStuNO Score1.GetAverage()endl; coutScore2.m_strStuNO Score2.GetAverage()endl; 析构函数析构函数 析构函数也要与相应的类同名,并在名称

29、前面加上析构函数也要与相应的类同名,并在名称前面加上一个一个“”符号。符号。class CStuScorepublic:. CStuScore ( ) / 析构函数析构函数. 析构函数只有在两种情况下才会被自动调用:析构函数只有在两种情况下才会被自动调用: (1) 当对象定义在一个函数体中,该函数调用结束后,当对象定义在一个函数体中,该函数调用结束后,析构函数被自动调用。析构函数被自动调用。 (2) 用用new为对象分配动态内存后,当使用为对象分配动态内存后,当使用delete释放释放对象时,析构函数被自动调用。对象时,析构函数被自动调用。 注意:它不返回任何值也没有任何参数注意:它不返回任何

30、值也没有任何参数所以它也不能被重载。所以它也不能被重载。调用构造函数和析构函数的顺序调用构造函数和析构函数的顺序注意:调用构造函数和析构函数的顺序刚好是相反的注意:调用构造函数和析构函数的顺序刚好是相反的对象数组对象数组定义一般格式:类名定义一般格式:类名 对象名对象名 ; 如:如:CStuScore Score100; /调用默认构造函数调用默认构造函数 在建立数组时,同样要调用构造函数在建立数组时,同样要调用构造函数。如果有。如果有100个元素,个元素,需要调用需要调用100次构造函数。次构造函数。析构函数析构函数负责数空间的释放和回收。负责数空间的释放和回收。 下列调用带参数的构造函数下

31、列调用带参数的构造函数: CStuScore Score3=CStuScore(王一王一,2011001), CStuScore(李二李二,2011002), CStuScore(张三张三,2011003) ; 对象数组对象数组CStuScore Score3= CStuScore(王一王一,2011001), CStuScore(李二李二,2011002), ; 调用调用默认构造函数默认构造函数对象数组对象数组void main()CStuScore Score3= CStuScore(王一王一,2011001), CStuScore(李二李二,2011002), CStuScore(张三张

32、三,2011003); for(int i=0;i3;i+) Scorei.SetScore(100,100,100); coutScorei.m_strNameScorei.m_strStuNOendl; 动态分配对象动态分配对象 CStuScore *pScore=new CStuScore;CStuScore *pScore=new CStuScore(张三张三, 21020502); 两种都是动态分配对象,并自动调用构造函数对其初始两种都是动态分配对象,并自动调用构造函数对其初始化。第一种要求默认构造函数,第二种要求带参数的构造函化。第一种要求默认构造函数,第二种要求带参数的构造函数。

33、数。创建堆对象时,先分配空间,然后调用对象的构造函数;创建堆对象时,先分配空间,然后调用对象的构造函数;删除堆对象时,先调用对象的析构函数,然后回收空间。删除堆对象时,先调用对象的析构函数,然后回收空间。#include #include using namespace std;class CStuScore public: CStuScore(string name=, string NO=11111111) m_strName=name; m_strStuNO=NO; void SetScore(float s0, float s1,float s2); / 设置三门课成绩设置三门课成绩

34、float GetAverage();public: string m_strName; string m_strStuNO; private: / 私有类型声明私有类型声明 float m_fScore3; / 三门课程成绩三门课程成绩 ;Ex1.h文件文件#include Ex1.h void CStuScore:SetScore(float s0, float s1,float s2) / 设置三门课成绩设置三门课成绩 m_fScore0 = s0; m_fScore1 = s1; m_fScore2 = s2; float CStuScore:GetAverage() return (

35、float)(m_fScore0 + m_fScore1 + m_fScore2)/3.0); void main() CStuScore *pScore=new CStuScore(张三张三, 21020502); if(NULL!=pScore) pScore-SetScore(80,95,90); coutm_strStuNO 的平均成绩为的平均成绩为GetAverage()endl; delete pScore; pScore=NULL; Ex1.cpp文件文件#include #include using namespace std;class CStuScore public: CStuScore(string name=, string NO=11111111) m_strName=new string(name); m_strStuNO=new string(NO); CStuScore() if(NULL!=m_strName)

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论