C++类和对象知识点复习

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第3章类和对象3.1类的构成3.2成员函数的定义3.3对象的定义和使用3.4构造函数与析构函数3.5对象的赋值与复制3.6自引用指针this3.7C++的string类3.1类的构成3.1.1从结构体到类3.1.2类的构成3.1.1从结构体到类1.结构体的扩充例如下面声明了一个日期结构体:structDate{intyear;//年intmonth;//月intday;//日};C语言结构体一般格式如下:struct结构名{数据};例3.1有关日期结构体的例子。#includeiostreamusingnamespacestd;structDate{//声明了一个名为Date的结构体intyear;intmonth;intday;};intmain(){Datedate1;date1.year=2014;//可以在结构体外直接访问数据yeardate1.month=3;//可以在结构体外直接访问数据monthdate1.day=1;//可以在结构体外直接访问数据daycoutdate1.year.date1.month.date1.dayendl;return0;}程序的运行结果如下:2014.3.1C语言中的结构体缺点:结构体变量可以在结构体外直接访问数据,在C结构体中的数据是很不安全的。C++中引入了类的概念,克服了C结构体的缺点。C++中引入了类的概念,它不仅可以含有数据,而且还可以含有函数。类中的数据和函数,分别称作数据成员和成员函数。类声明的简化格式如下:class类名{数据函数};类的声明由关键字class打头,后跟类名花括号中是类体以一个分号“;”结束类声明的简化格式如下:class类名{数据成员函数函数};3.1.2类的构成在类中,数据成员和成员函数分别属于private部分、和public部分。数据成员和成员函数一般也统称为类的成员。类声明的一般格式如下:class类名{public:公有数据成员;公有成员函数;private:私有数据成员;私有成员函数;};公有成员既可被类内的成员函数访问,也可被类的外部访问,是类与外界的接口。私有成员只能被类内的成员函数访问,而类外部的任何访问都是非法的。用一个类Date来描述日期,其形式如下:classDate{public:voidsetDate(inty,intm,intd);//公有成员函数voidshowDate();//公有成员函数private:intyear;//私有数据成员intmonth;//私有数据成员intday;//私有数据成员};私有数据成员year、month和day只能由内部成员函数访问,在类的外部无法访问,保护了私有数据的安全。设置日期成员函数setDate和日期显示成员函数showDate都是公有的成员函数,类外部对类Date的数据进行操作,只能通过这两个函数来实现。说明:(1)除了private和public之外,类中的成员还可以用另一个关键字protected来说明。被protected说明的数据成员和成员函数称为保护成员。类声明的完整格式如下:class类名{public:公有数据成员;公有成员函数;protected:保护数据成员;保护成员函数;private:私有数据成员;私有成员函数;};保护成员可以由本类的成员函数访问,也可以由本类的派生类的成员函数访问,而类外的任何访问都是非法的。(2)具体的类来,类声明格式中的3个部分并非一定要全有,但至少要有其中的一个部分。一般情况,一个类的数据成员应该声明为私有成员,成员函数声明为公有成员。内部的数据整个隐蔽在类中,在类的外部根本就无法看到,使数据得到有效的保护。(3)类声明中的private、protected和public三个关键字可以按任意顺序出现任意次。但是,如果把所有的私有成员、保护成员和公有成员归类放在一起,程序将更加清晰。(4)C++规定,在默认情况下(即没有指定成员是私有、保护或公有时),类中的成员是私有的。例3.2将例3.1中的结构体struct改为类class。#includeiostreamusingnamespacestd;classDate{//将例3.1中的结构体struct改为类classintyear;//私有数据成员intmonth;//私有数据成员intday;//私有数据成员};intmain(){Datedate1;date1.year=2014;//错误,在类外不能访问私有数据成员yeardate1.month=3;//错误,在类外不能访问私有数据成员monthdate1.day=1;//错误,在类外不能访问私有数据成员daycoutdate1.year.date1.month.“date1.dayendl;//错误,不能访问私有数据成员return0;}私有成员只能被类内的成员函数访问,而类外部的任何访问都是非法的。如何才能访问类中的私有数据成员呢?#includeiostream//例3.1有关日期结构体的例子。usingnamespacestd;structDate{//声明了一个名为Date的结构体intyear;//公有的数据成员intmonth;//公有的数据成员intday;};//公有的数据成员intmain(){Datedate1;date1.year=2014;//可以在结构体外直接访问数据yeardate1.month=3;//可以在结构体外直接访问数据monthdate1.day=1;//可以在结构体外直接访问数据daycoutdate1.year.date1.month.date1.dayendl;return0;}程序的运行结果如下:2014.3.1在默认情况下,结构体中的成员是公有的。因此,例3.1中数据成员year、month和day默认为是公有的,结构体外的变量date1能够对它们直接进行访问(5)不能在类声明中给数据成员赋初值。例如:classabc{private:chara=q;//错误intb=33;//错误public:…};C++规定,只有在对象定义之后才能给数据成员赋初值3.2成员函数的定义3.2.1普通成员函数的定义3.2.2内联成员函数的定义3.2.1普通成员函数的定义将成员函数以普通成员函数(即非内联的成员函数)的形式进行定义。在类声明中只给出成员函数的原型,而将成员函数的定义放在类外部。例如:Student∷成员函数名(参数表)成员函数在类外定义的一般形式是:返回值类型类名∷成员函数名(参数表){函数体}在类名和成员函数名之间应加上作用域运算符“∷”classStudent{//学生类的定义-1private:intnumber;floatscore;public:voidinput(intnumber1,floatscore1);//函数原型1,输入成绩voidmodify(floatscore1);//函数原型2,修改成绩voidprint();//函数原型3,打印成绩};voidStudent::input(intnumber1,floatscore1)//函数定义1{number=number1;score=score1;}voidStudent::modify(floatscore1)//函数定义2{score=score1;}voidStudent::print()//函数定义3{cout\nnumber:numberscore:score;}在类声明中只给出成员函数的原型,将成员函数的定义放在类外部。在函数名前应加上类名和作用域运算符“∷”说明:(1)在类声明中,成员函数原型的参数表中可以不说明参数的名字,而只说明它们的类型。例如:voidmodify(floatscore1);在类外定义成员函数时,不但要说明参数表中参数的类型,还必须要指出其参数名。例如:voidStudent::modify(floatscore1){score=score1;}(2)采用“在类声明中只给出成员函数的原型,成员函数的定义放在类的外部”的定义方式,是C++程序设计的良好习惯。3.2.2内联成员函数的定义(1)隐式声明将成员函数直接定义在类的内部。例如:classStudent{//学生类的定义-2private:intnumber;floatscore;public:voidinput(intnumber1,floatscore1)//定义成员函数{number=number1;score=score1;}voidmodify(floatscore1)//定义成员函数{score=score1;}voidprint()//定义成员函数{cout\nnumber:numberscore:score;}};将成员函数直接定义在类内部,编译时是作为内联函数的方式来处理(内联函数隐式定义)(2)显式声明在类声明中只给出成员函数的原型,而成员函数的定义放在类外部。但在类外部成员函数的定义前冠以关键字“inline”,使它起到内联函数的作用。classStudent{private:intnumber;floatscore;public:voidinput(intnumber1,floatscore1);...};inlinevoidStudent::input(intnumber1,floatscore1){number=number1;score=score1;}成员函数的原型冠以关键字“inline”使用inline定义内联函数时,可以在声明函数原型和定义函数时同时写inline,也可以在其中一处声明inline,效果是相同的,都能按内联函数处理。但是,必须将类的声明和内联成员函数的定义都放在同一个文件(或同一个头文件)中,否则编译时无法进行代码置换。classStudent{//学生类的定义-3private:intnumber;floatscore;public:inlinevoidinput(intnumber1,floatscore1);//函数原型1inlinevoidmodify(floatscore1);//函数原型2inlinevoidprint();//函数原型3};inlinevoidStudent::input(intnumber1,floatscore1){number=number1;//函数定义1score=score1;}inlinevoidStudent::modify(floatscore1){score=score1;}//函数定义2inlinevoidStudent::print()//函数定义3{cout\nnumber:numberscore:score;}冠以关键字“inline”3.3对象的定义和使用3.3.1类与对象的关系3.3.2.对象的定义3.3.3对象中成员的访问3.3.4类的作用域和类成员的访问属性3.3.1类与对象的关系在C++中,类与对象间的关系,可以用数据类型int和整型变量i之间的关系来类比。类类型和int类型均代表的是一般的概念,而对象和整型变量却是代表具体的东西。数据类型实例inta,b(变量)学生类张三,李四(对象)水果类苹果,桔子(对象)3.3.2.对象的定义定义对象可以用以下两种方法:方法1:在声明类的同时,直接定义对象,即在声明类的右花括号“}”后,直接写出属于该类的对象名表。例如:classStudent{//....}stu1,stu2;在声明类Student的同时,直接定义对象stu1和stu2方法2:声明了类之后,在使用时再定义对象。其一般形式如下:classStudent{//…};…Studentstu1,stu2;在使用时再定义对象,此时定义了类Student的两个对象stu1和stu2说明:声明了一个类便声明了一种类型,这时没有给它分配存储空间,只有定

1 / 108
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功