版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C++语言程序设计第十一组C++语言程序设计第七章
类与对象C++语言程序设计1目录C++语言程序设计2“类和对象的定义构造函数析构函数面向对象程序设计基本知识对象数组对象作为普通函数的参数与返回值对象指针和堆对象编程技能this指针复制构造函数内部类和命名空间刨根问底C++语言程序设计3基本知识a7.1类和对象的定义常见的程序设计方法(1)面向过程的程序设计流程化的思想,围绕存放数据的基本变量来组织程序将变量的赋值作为程序的基本操作以变量值的改变作为程序的运行状态以函数的调用来实现代码的重用(2)面向对象的程序设计是按照类和对象的思想来组织程序类似于人类思维模式的方法去解决客观问题事物——对象,类别——类C++语言程序设计47.1类和对象的定义面向对象的程序设计每个对象都拥有自己的“状态”和“行为”。“状态”在程序设计中称为数据、变量或属性“行为”在程序设计中称为方法或函数。各对象间通过方法的调用实现交互,完成一定的任务。用“类”将数据和对数据的操作封装在一个单独的数据结构中程序的模块化程度更高,具有更强的描述客观事物的能力,适合大型的程序开发。C++语言程序设计57.1类和对象的定义举例:学籍管理软件需要管理大量的学生,每个学生都是一个对象学生都有一些共同的属性特征和行为动作学生是一类事物,因此,可以从这一组具有相同属性和行为的学生对象中抽象出一个学生类。C++语言程序设计6学生类方法属性张三走,学习男,23对象类李四走,学习男,20对象……7.1类和对象的定义学生类举例C++语言程序设计7Student设置成绩学生信息输出学号姓名年龄成绩学生类方法属性数据成员(DataMembers)成员函数(MemberFunctions)7.1类和对象的定义对比结构类型C++语言程序设计8classStudent//类的定义{private: intid; charname[20]; intage; floatscore;public: voidsetscore(); voidprintstu();};
structstudent//结构体类型定义
{
intid;stringname;intage;floatscore;
};类和结构体都是一种自定义数据类型,有许多相似的地方,但是类的成员默认是private的,不可以任意访问7.1类和对象的定义使用类定义对象C++语言程序设计9classstudenta;a:student类型的变量,称为对象class可省略通过对象调用公有接口函数实现一定的功能。a.setscore();a.printstu();7.1类和对象的定义类的声明具体说明类的组成,声明类的语法形式C++语言程序设计10class类名称{public:
公有成员protected:
保护型成员private:
私有成员};//注意最后一定要有分号数据成员成员函数7.1类和对象的定义私有(private)成员(默认)只允许本类的成员函数来访问公有(public)成员类对外的接口,在类声明和类(函数)实现之后,类的对象可以访问公有成员。保护型(protected)成员可访问性和私有成员的性质相似,在学习“继承”时再理解。C++语言程序设计117.1类和对象的定义C++语言程序设计12关于访问控制属性,注意:三种访问控制属性顺序习惯将公有类型放在最前面可以按任意次序出现,也可以不出现,可以多次出现一个成员只能具有一种访问控制属性。如果不写访问控制属性关键字默认的是private数据成员一般情况声明为私有成员(封装性较好)函数成员应该有一些公有的函数成员,作为对外的接口,否则别的代码无法访问类7.1类和对象的定义C++语言程序设计13//Clock.hclassClock //类的声明{public:voidSetTime(intnewH,intnewM,intnewS);voidShowTime();private:intHour;intMinute;intSecond;}; 一般将类的声明单独写到扩展名为.h的头文件中7.1类和对象的定义C++语言程序设计14类的实现类的成员函数描述的是类的行为或操作。函数的原型声明要在类的主体中,而函数的具体实现一般写在类声明之外。定义类的成员函数成员函数可以访问本类的任意成员!返回值类型类名::成员函数名(参数表){函数体}作用域操作符表示函数属于哪个类7.1类和对象的定义C++语言程序设计15类的实现举例//实现类成员函数的源文件:Clock.cpp#include"Clock.h"voidClock::SetTime(intnewH,intnewM,intnewS)//SetTime()函数定义{
Hour=newH;Minute=newM;Second=newS;}voidClock::ShowTime() //ShowTime()函数定义{
cout<<Hour<<":"<<Minute<<":"<<Second<<endl;}一般将类的实现单独写到扩展名为.cpp的原文件中文件名同类的声明文件名一致7.1类和对象的定义C++语言程序设计16类的成员函数还可以有多种形态——参数带默认值classClock{public:voidSetTime(intnewH=0,intnewM=0,intnews=0);voidShowTime();private:intHour;
intMinute;
intSecond;};7.1类和对象的定义C++语言程序设计17类的成员函数还可以有多种形态——函数实现直接放在类的声明中classClock{public:
voidSetTime(intnewH=0,intnewM=0,intnews=0);voidShowTime(){
cout<<Hour<<":"<<Minute<<":"<<Second<<endl;}
private:intHour;
intMinute;
intSecond;};7.1类和对象的定义C++语言程序设计18类的成员函数还可以有多种形态——函数重载classClock{public:
voidSetTime(intnewH=0,intnewM=0,intnews=0);voidShowTime(){
cout<<Hour<<":"<<Minute<<":"<<Second<<endl;}
voidShowTime(intn){ cout<<Hour<<“时”<<Minute<<“分”<<Second<<“秒”<<endl;}private:intHour,Minute,Second;};7.1类和对象的定义C++语言程序设计19对象的定义和使用对象,又称为类的实例类的成员是抽象的,对象的成员才是具体的类声明中的数据成员一定不能有具体的属性值只有对象的成员才会有具体的属性值声明了类及其对象,在类的外部就可以访问对象的公有成员了。公有成员可以是数据成员,也可以是函数成员定义一个对象和定义一个一般变量相同,语法形式为:类名称
对象名称;7.1类和对象的定义#include“Clock.h”voidmain(){
Clockmyclock;myclock.SetTime(12,5,0);myclock.ShowTime();}C++语言程序设计207.1类和对象的定义类的作用域类作用域是指类定义和相应的成员函数定义的范围,通俗地称为类的内部。
C++认为一个类的全部成员都是一个整体的相关部分。一个类的所有成员位于这个类的作用域内,在该范围内,一个类的成员函数对本类的其它成员具有无限制的访问权。
C++语言程序设计21voidClock::SetTime(intnewH,intnewM,intnewS)//SetTime()函数定义{Hour=newH;Minute=newM;Second=newS;}7.1类和对象的定义类的可见性类名实际是个类型名,允许类与其他类型变量或其他函数同名。在类的内部,与类或类的成员同名的全局变量名或函数名不可见。C++语言程序设计22voidfunc() {Clocka; //定义对象时要用到类名intClock=10; //变量名和类名相同Clock++; //…};intClock(){return1;}
//定义函数
classClock{
//定义类public:intf(){returnClock();}
//调用函数错误};从程序可读性考虑,一般不要让类名和其他变量、函数用同样的名字。7.2构造函数不同的对象如何区分?区别于其他对象的地方主要有两个,外在的区别就是对象的标识符,即对象的名称,而内在的区别就是对象自身的属性值,即数据成员的值。在定义一个对象的时候要给它分配存储空间,也可以同时给它的数据成员赋初值,称为对象的初始化。C++程序中的对象初始化工作由一个特殊的成员函数来完成,就是构造函数。构造函数是类的成员函数。
因为不同类型的对象的初始化工作是不一样的,因此构造函数从属于某个类的,即每个类都要定义它自己的构造函数。C++语言程序设计237.2构造函数定义构造函数的一般形式为:class类名{public:
类名(形参表); //构造函数的原型 //类的其它成员};类名::类名(形参表) //构造函数的实现{ //函数体}
C++语言程序设计247.2构造函数定义构造函数:C++语言程序设计25Clock::Clock(intH,intM,intS){
Hour=H;Minute=M;Second=S;}classClock{public:Clock(intH,intM,intS); //构造函数
voidSetTime(intnewH,intNewM,intnewS);
voidShowTime();private:
intHour;
intMinute;
intSecond;};ClockMyClock(120,1);//正确MyClock.ShowTime(); Clockb; //错误!7.2构造函数构造函数的特点:函数名:与类名相同访问属性:构造函数一定是公有函数。是类的成员函数,可以直接访问类的所有数据成员。具有一般函数的特点:函数可以带默认形参值,也可以重载。
哪一点除外?C++语言程序设计26构造函数没有返回类型,不能返回值7.2构造函数构造函数的特点:每个类都会存在构造函数不管用户在定义是是否定义。若用户未定义构造函数,编译器会自动添加默认构造函数若用户定义了构造函数,编译器则不会自动添加C++语言程序设计27classClock{public:
voidSetTime();voidShowTime();private:intHour,Minute,Second;};classClock{public:
Clock::Clock()//默认构造函数{}
voidSetTime();voidShowTime();private:intHour,Minute,Second;};7.2构造函数构造函数的重载:C++语言程序设计28#include<iostream>usingnamespacestd;classTdate{public:Tdate(); //第一个构造函数
Tdate(intd); //第二个构造函数
Tdate(intm,intd); //第三个构造函数
Tdate(intm,intd,inty);
//第四个构造函数private:
intmonth;
intday;
intyear;};7.2构造函数构造函数的重载:C++语言程序设计29Tdate::Tdate(){month=4;day=15;year=1995;cout<<month<<"/"<<day<<"/"<<year<<endl;}Tdate::Tdate(intd){month=4;day=d;year=1996;cout<<month<<"/"<<day<<"/"<<year<<endl;}Tdate::Tdate(intm,intd){month=m;day=d;year=1997;cout<<month<<"/"<<day<<"/"<<year<<endl;}Tdate::Tdate(intm,intd,inty){month=m;day=d;year=y;cout<<month<<"/"<<day<<"/"<<year<<endl;}voidmain(){//开始用4种方式构造4个对象
Tdateaday;
Tdatebday(10);Tdatecday(2,12);Tdatedday(1,2,1998);}7.2构造函数复制构造函数(也称为拷贝构造函数)复制构造函数的形参是类的对象的引用Clock(constClock&a){……}复制构造函数与原来的构造函数实现了函数的重载。自动生成特点如果在类定义时没有定义复制构造函数,系统会生成默认的复制构造函数。默认的复制构造函数完成所有数据成员的复制何时会自动执行复制构造函数:通过“=”复制对象时对象作为函数的参数,函数调用时函数返回对象时C++语言程序设计307.2构造函数复制构造函数(也称为拷贝构造函数)C++语言程序设计31classTdate{public:
Tdate(constTdate&);
……};Tdatea;Tdateb=a;voidfun(Tdatex){……}fun(a);voidfun2(){Tdatex;…….returnx;}fun2();Tdatex=fun2();7.3析构函数与构造函数相反,当对象生存期结束时,需要调用析构函数,释放对象所占的内存空间。特点:访问属性:公有成员函数函数名:在类名前加“~”构成无参数、无返回值。能否重载?自动生成析构函数是在对象生存期即将结束的时刻由系统自动调用的。如果程序员没有定义析构函数,系统将自动生成和调用一个默认析构函数。C++语言程序设计327.3析构函数#include<iostream>usingnamespacestd;classstudent{public:
student(char*);student(student&);
~student();voidprintstu();private: char*name;};C++语言程序设计33student::student(char*c){
cout<<"Constructing..."<<endl;name=newchar[strlen(c)+1];
strcpy(name,c);}student::student(student&s)//复制构造函数{
cout<<"CopyConstructing..."<<endl;name=newchar[strlen()+1;strcpy(name,);//复制字符串}7.3析构函数student::~student(){cout<<"Destructing..."<<endl;delete[]name;}voidstudent::printstu(){cout<<"姓名:"<<name<<endl;}voidmain(){studentstu("wang");stu.printstu();}C++语言程序设计347.4面向对象程序设计类的封装性对具体问题进行概括,抽象出类的数据成员和函数成员,将这些数据和代码相结合,形成一个有机的整体将数据与操作数据的行为进行有机结合,这就是封装性(Encapsulation)C++语言提供类来实现封装类是属性和操作的结合体,并且在定义类的属性和操作时,规定了它们的可见性。通过封装将一部分成员作为类与外部的接口,而将其他成员隐藏起来,以防外界的干扰和误操作,使程序不同模块之间的相互影响减小到最低限度C++语言程序设计357.4面向对象程序设计软件工程建立一个大型的软件系统可不是一件简单的事情,它是一项大工程,人们称它为软件工程,它研究如何建立大型软件系统:可靠性;成本效益好;可理解性;可维护性。C++语言程序设计367.4面向对象程序设计面向对象程序设计是面向对象思想在软件工程领域的全面应用,包括:面向对象分析(OOA),面向对象设计(OOD),面向对象编程(OOP)等。面向对象分析阶段要把问题的范围定义清楚,分析系统需求,把实际中不重要的东西忽略,对所关心的问题建立一个模型。设计是在分析的基础上进一步加工,OOD阶段是对OOA模型的修改和补充,采用一致的概念、原则和表示法,二者没有严格的阶段划分,但设计阶段侧重于考虑与实现有关的细节。到了OOP阶段,OOD阶段设计的类被具体的程序设计语言的类所实现。C++语言程序设计37C++语言程序设计编程技能b38(一)对象数组C++语言程序设计39数组元素类型不仅可以是基本数据类型也可以是自定义的类型:结构类型,类类型等对象数组的元素是对象,不仅具有数据成员,还有函数成员,可以通过数组元素调用成员函数。举例:学生类的对象数组studentarr[100];(一)对象数组#include<iostream>#include<string>usingnamespacestd;classstudent{private:
stringname;
public:voidset(char*);voidprintstu(){cout<<"姓名:"<<name<<endl;}};C++语言程序设计40voidstudent::set(char*c){name=c;}voidmain(){studentstu[5];//对象数组stu[0].set("wang");//设置数组中每个对象stu[1].set("Li");stu[2].set("zhao");stu[3].set("guo");stu[4].set("meng");for(inti=0;i<5;i++)stu[i].printstu(); //显示每个对象}(一)对象数组#include<iostream>#include<string>usingnamespacestd;classstudent{private:
stringname;
public:
student(char*c){set(c);}voidset(char*);voidprintstu(){cout<<"姓名:"<<name<<endl;}};C++语言程序设计41voidstudent::set(char*c){name=c;}voidmain(){studentstu[5]={
student("wang"), student("Li"); student("zhao"); student("guo"); student("meng");}for(inti=0;i<5;i++)stu[i].printstu(); //显示每个对象}(一)对象数组#include<iostream>#include<string>usingnamespacestd;classstudent{private:
stringname;
public:
student(char*c){set(c);}
student(){name=‘’;}voidset(char*);voidprintstu(){cout<<"姓名:"<<name<<endl;}};C++语言程序设计42voidstudent::set(char*c){name=c;}voidmain(){studentstu[5]={
student("wang"), student("Li"); student("zhao");}
stu[3].set("guo");stu[4].set("meng");for(inti=0;i<5;i++)stu[i].printstu(); //显示每个对象}student(char*c=“”){set(c);}定义数组时始终要记住:自动调用构造函数对所有对象进行初始化(二)对象作为普通函数的参数与返回值C++语言程序设计43在C++中,类是一个自定义的数据类型,对象是该数据类型的一个变量。studentstu;inti;类类型也可以作为一个函数的参数类型和返回值类型studentf(students){……..}(二)对象作为普通函数的参数与返回值C++语言程序设计44类类型作为函数的参数类型时:实参传递给形参自动调用复制构造函数voidsomeFunc(Tdatesomeday){someday.print();}intmain(){
Tdates(2003,15,2);someFunc(s);
……}classTdate{public:voidTdate(int,int,int);
voidPrint();private:intmonth;intday;intyear;};(二)对象作为普通函数的参数与返回值C++语言程序设计45类类型作为函数的返回类型时:return返回对象时自动执行复制构造函数TdatesomeFunc(Tdatesomeday){returnsomeday;}intmain(){
Tdates(2003,15,2);someFunc(s);
……}classTdate{public:voidTdate(int,int,int);
voidPrint();private:intmonth;intday;intyear;};(二)对象作为普通函数的参数与返回值C++语言程序设计46类类型作为函数的返回类型时:return返回对象时自动执行复制构造函数需要注意的是,函数返回后直接初始化另一个对象时,仅执行一次复制构造函数TdatesomeFunc(Tdatesomeday){returnsomeday;}intmain(){
Tdates(2003,15,2);Tdatet=someFunc(s);
……}(二)对象作为普通函数的参数与返回值C++语言程序设计47类类型的指针或引用作为函数的参数类型或返回类型时:由于传递的是指针,所以不会执行复制构造函数Tdate&someFunc(Tdate&someday){returnsomeday;}intmain(){
Tdates(2003,15,2);Tdatet=someFunc(s);
……}Tdate*someFunc(Tdate*someday){returnsomeday;}intmain(){
Tdates(2003,15,2);Tdatet
=*someFunc(&s);
……}(三)对象指针和堆对象C++语言程序设计48对象相当于变量,所以可以定义对象指针或对象引用,或动态地从堆中申请空间来创建一个对象。Clockc; //在栈中分配Clock型存储空间Clock*pc1=newClock; //在堆中分配Clock型存储空间Clock*pc2=&c;Clock&rc=*pc1//创建对象的引用(三)对象指针和堆对象C++语言程序设计49使用对象指针访问对象的成员,要使用“->”运算符。语法形式为:
对象指针名->公有成员;voidmain(){Clock*pmyclock=newClock;pmyclock->SetTime(12,5,0);pmyclock->ShowTime();deletepmyclock;}classClock{public:Clock(intH,intM,intS); //构造函数
voidSetTime(intnewH,intNewM,intnewS);
voidShowTime();private:
intHour;
intMinute;
intSecond;};刨根问底cC++语言程序设计50(I)
this指针C++语言程序设计51在类的外部访问类成员必须通过对象来调用。在成员函数内部,访问数据成员或成员函数时并没有看到这些成员属于哪个对象。voidmain(){Clocks;Clockt;s.SetTime(12,5,0);t.SetTime(10,30,30);s.ShowTime();t.ShowTime();}voidClock::SetTime(intH,intM,intS){
Hour=H;
Minute=M;
Second=S;}成员函数又是如何识别Hour、Minute和Second属于哪个对象呢?(I)
this指针C++语言程序设计52在对象调用s.SetTime(12,5,0)时,成员函数除了接收3个实参外,还接收了一个对象s的地址。虽然我们看到的只有3个参数,但真正的参数是4个,其中第一个参数是隐含的,这个参数的数据类型为Clock*,形式参数的名称为this。因此,类Clock的成员函数SetTime()的原型实际上是:voidSetTime(Clock*this,intH,intM,intS)隐含参数(I)
this指针C++语言程序设计53类Clock的成员函数SetTime()的实现也可以如下:一般我们编写代码时省去了this->voidClock::SetTime(
intH,intM,intS){
this->Hour=H;
this->Minute=M;
this->Second=S;}this指针保存了调用此成员函数的对象地址(II)
复制构造函数C++语言程序设计54复制构造函数是否可有可无?有些情况下,可以不写,使用默认的复制构造函数但有些情况下,必须要编写——深拷贝复制构造函数何时执行?通过“=”复制,初始化新对象时对象作为函数的参数,函数调用时函数返回对象时若类中含有指针成员,执行默认复制构造函数时(浅拷贝):会将一个原对象的指针成员复制到新对象的指针成员若指针成员指向堆内存,在原对象生存期结束时,析构函数将堆内存释放,则新对象的指针成员会变为悬挂指针,新对象生存期结束时,析构函数将出现错误!(II)
复制构造函数C++语言程序设计55#include<iostream>usingnamespacestd;classstudent{public:
student(char*);
~student();voidprintstu();private: char*name;};student::student(char*c){
cout<<"Constructing..."<<endl;name=newchar[strlen(c)+1];
strcpy(name,c);}student::~student(){cout<<"Destructing..."<<endl;delete[]name;}voidstudent::printstu(){cout<<"姓名:"<<name<<endl;}(II)
复制构造函数C++语言程序设计56voidmain(){studentstu("wang");stu.printstu();}没有错误!voidmain(){studentstu("wang");
st
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年度宁国市事业单位统一公开招聘工作人员16名参考考试题库及答案解析
- 2026年江西生物科技职业学院高职单招职业适应性测试备考试题及答案详细解析
- 2026年贵州食品工程职业学院单招综合素质考试备考试题含详细答案解析
- 2026年武汉城市职业学院单招综合素质考试参考题库含详细答案解析
- 2026年河南检察职业学院单招综合素质笔试备考题库含详细答案解析
- 2026年江苏商贸职业学院单招职业技能考试备考题库含详细答案解析
- 2026年云南现代职业技术学院单招职业技能考试模拟试题含详细答案解析
- 2026年广西自然资源职业技术学院单招职业技能考试备考试题含详细答案解析
- 2026年枣庄科技职业学院单招综合素质笔试备考题库含详细答案解析
- 2026年湖南汽车工程职业学院单招职业技能考试备考试题含详细答案解析
- 妇科医师年终总结和新年计划
- 2026海南安保控股有限责任公司招聘11人笔试模拟试题及答案解析
- 装饰装修工程施工组织设计方案(二)
- 2026上海碧海金沙投资发展有限公司社会招聘参考题库必考题
- 保险业客户服务手册(标准版)
- 检验科内控制度
- DB44-T 2771-2025 全域土地综合整治技术导则
- 智能水务管理基础知识单选题100道及答案
- 《职业院校与本科高校对口贯通分段培养协议书》
- 危岩带治理工程初步设计计算书
- 精神病学考试重点第七版
评论
0/150
提交评论