版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第5章 类与对象 第第5章章 类与对象类与对象内容提要内容提要v本章作为面向对象程序编程根底,将引见类的根本概念、类的定义方法。重点引见类的成员函数、数据成员以及类的访问限制。v引见构造函数和析构函数的定义和运用以及如何重载构造函数。v引见this指针以及const修饰符第第5章章 类与对象类与对象5.1 类的定义类的定义v 类源于现实生活中,是所遇见的实真实在的对象,对每类源于现实生活中,是所遇见的实真实在的对象,对每个对象的认识就需求笼统的概念,分类的结果使对象更个对象的认识就需求笼统的概念,分类的结果使对象更加详细和细化。加详细和细化。v 例如:问什么是桑塔那?回答是一种小汽车;再问什么
2、例如:问什么是桑塔那?回答是一种小汽车;再问什么是小汽车?普通回答是一种交通工具等等。在面向对象是小汽车?普通回答是一种交通工具等等。在面向对象的计算机世界里,一辆实真实在的桑塔纳小汽车称为类的计算机世界里,一辆实真实在的桑塔纳小汽车称为类桑塔纳的实例或对象。类桑塔纳是类小汽车的一个子类,桑塔纳的实例或对象。类桑塔纳是类小汽车的一个子类,而类小汽车是类交通工具的一个子类,等等。在本章中,而类小汽车是类交通工具的一个子类,等等。在本章中,要引入全新的编程思想,就是类的概念。要引入全新的编程思想,就是类的概念。 第第5章章 类与对象类与对象类类v 类是对客观事物的一种高度笼统,是具有一组一样属性和
3、操作的集合,因此它包括两个部分的内容:数据成员和成员函数,其定义格式为:v class vpublic:v /数据成员或者成员函数vprivate:v /数据成员或者成员函数vprotected:v /数据成员或者成员函数v ;v v 类的定义和构造的定义有些类似,但是类和构造有本质的区别:类定义中默许的情况下成员是private的,而构造定义中的默许成员是public的。在C言语中,构造中不允许有成员函数,在C+言语中可以有成员函数。v 对象:程序中用来描画一个个的详细实体。 第第5章章 类与对象类与对象几点阐明几点阐明v 1 1大括号的部分是类的成员数据成员和函数成员,它们分成三大括号的部
4、分是类的成员数据成员和函数成员,它们分成三部分,分别由部分,分别由privateprivate、publicpublic、proctectedproctected三个关键字后跟冒号来指三个关键字后跟冒号来指定。这三部分可以任何顺序出现,且在一个类的定义中,这三部分并定。这三部分可以任何顺序出现,且在一个类的定义中,这三部分并非必需同时出现。非必需同时出现。v 2 2类中数据成员不允许运用表达式进展初始化;类中数据成员不允许运用表达式进展初始化;v 3 3类中数据成员与成员函数可用类中数据成员与成员函数可用constconst修饰。修饰。v 4 4经常习惯地将类定义的阐明部分或者整个定义部分经常
5、习惯地将类定义的阐明部分或者整个定义部分( (包含实现部包含实现部分分) )放到一个头文件中。见放到一个头文件中。见P144P144、P146P146第第5章章 类与对象类与对象运用C+言语的类案例称号:运用C+言语的类#include class person / 建立类称号为personpublic: char * name; int height;/ 描画身高 int weight;/ 描画体重;void main()person Zhang_three; / 建立Zhang_three实例对象Zhang_ = 张三; / Chang_three的名字张三Zhang_
6、three.height = 175; / Chang_three的身高175Zhang_three.weight = 60; / Chang_three的体重60cout 名字 : Zhang_ n身高 : Zhang_three.height n体重 : Zhang_three.weight endl;第第5章章 类与对象类与对象运用构造来实现运用构造来实现v struct Personstruct Personv v char name20; char name20;v int height; int height; / / 描画身高描画身高v int weight;
7、 int weight; / / 描画体重描画体重v ;v int main(int argc, char int main(int argc, char * *argv)argv)v v Person pr1=“ Person pr1=“张三张三, 175,60;, 175,60;v cout cout v pr1.height pr1.height v pr2.weight endl; pr2.weight endl;v v 第第5章章 类与对象类与对象5.2 5.2 数据成员数据成员 v 数据成员又叫成员变量或者属性。数据成员的声明方式和变量的数据成员
8、又叫成员变量或者属性。数据成员的声明方式和变量的声明方式根本一样,格式为:声明方式根本一样,格式为:“ ;,v 在声明一个数据成员时,需求留意两点:在声明一个数据成员时,需求留意两点:v 1不能采用不能采用auto、extern和和register修饰符进展修饰;修饰符进展修饰;v 2只需采用只需采用static修饰符声明的静态数据成员才可以被显式初修饰符声明的静态数据成员才可以被显式初始化,它具有特殊的属性。假设试图在类体中直接初始化非静态始化,它具有特殊的属性。假设试图在类体中直接初始化非静态数据成员,会导致编译错误。数据成员,会导致编译错误。第第5章章 类与对象类与对象成员函数成员函数
9、v成员函数又叫方法,方法就是函数,当函数被成员函数又叫方法,方法就是函数,当函数被类封装的时候称之为方法。类封装的时候称之为方法。v成员函数在类体中的声明方式和普通函数的声成员函数在类体中的声明方式和普通函数的声明方式一样,成员函数可以在类体内被定义,明方式一样,成员函数可以在类体内被定义,也可以在类体外被定义。在类体内被定义被以也可以在类体外被定义。在类体内被定义被以为是内联函数。为是内联函数。 第第5章章 类与对象类与对象在类中定义成员函数案例称号:在类中定义成员函数#include class person / 建立类称号为personpublic: char * name; int h
10、eight; / 描画身高 int weight; / 描画体重void After_OneYear()height += 10;weight -= 10;void main()person Zhang_three;/ 建立Zhang_three实例对象Zhang_ = “张三; / Chang_three的名字张三Zhang_three.height = 175;/ Chang_three的身高175Zhang_three.weight = 60;/ Chang_three的体重60 Zhang_three.After_OneYear(); /调用方法cout 名字 :
11、Zhang_ n身高 : Zhang_three.height n体重: Zhang_three.weight “-,才干访问类对象的成员。,才干访问类对象的成员。v 其中,其中,“.“.用于类对象或援用,用于类对象或援用,“-“-用于指向类对象的指针,用于指向类对象的指针,运用指针定义对象就需求运用运用指针定义对象就需求运用“-“-, 第第5章章 类与对象类与对象类对象成员的访问案例称号:类对象成员的访问# include class Tdate private:int month;public:void setMonth(int d)month = d;int getM
12、onth()return month;void main()Tdate b ;b .setMonth(10);cout b.getMonth() endl;第第5章章 类与对象类与对象5.6 5.6 类的作用域和对象的生存期类的作用域和对象的生存期v 内即为类作用域内即为类作用域v 在类作用域中声明的标识符只在该类中具有可见性在类作用域中声明的标识符只在该类中具有可见性v 成员名限定:类中一个成员名字可以运用类名和作用域成员名限定:类中一个成员名字可以运用类名和作用域运算符来显式指定运算符来显式指定v class C class C void C:set(int val)void C:set(
13、int val)vpublic: public: v C:value= val;C:value= val;vvoid set(int val); void set(int val); return;return;vprivate:private: vint value;int value;v ;第第5章章 类与对象类与对象 对象从诞生到终了的这段时间就是它的生存期。 对象的生存期可以分为静态生存期和动态生存期两种。静态生存期假设对象生存期与程序生存期一样,我们称它具有静态生存期。在文件中声明的对象都是具有静态生存期的。假设要在函数内部的块作用域中声明具有静态生存期的对象,那么要运用关键字sta
14、tic,动态生存期动态生存期对象诞生于声明点,终了于该标识符作用域终了处。 动态生存期例子:Circle gc; /具有静态生存期,文件作用域void main() gc.SetRadius(7); gc.PrintCircumference(); Circle c; /声明具有动态作用域的对象c c.SetRadius(5); /援用对象c c.PrintCircumference();第第5章章 类与对象类与对象5.8 5.8 对象的初始化对象的初始化v 而当对象被定义时,由于对象的意义表达了现实世界的实体,而当对象被定义时,由于对象的意义表达了现实世界的实体,所以一旦定义对象,就必需有一
15、个有意义的初始值,在所以一旦定义对象,就必需有一个有意义的初始值,在C+C+中,中,在定义对象的同时,给该对象初始化的方法就是利用构造函数。在定义对象的同时,给该对象初始化的方法就是利用构造函数。下面分别从三个方面讲述初始化问题:下面分别从三个方面讲述初始化问题:v 1 1、类中数据成员的初始化:构造函数和析构函数、类中数据成员的初始化:构造函数和析构函数v 2 2、类中常量和援用的初始化:初始化表、类中常量和援用的初始化:初始化表v 3 3、类中对象成员的初始化:初始化表、类中对象成员的初始化:初始化表v 4 4、类的对象初始化:拷贝构造函数、类的对象初始化:拷贝构造函数第第5章章 类与对象
16、类与对象(1)(1)构造函数的概念构造函数的概念 v 构造函数的功能是在创建对象时,运用给定的值来将对构造函数的功能是在创建对象时,运用给定的值来将对象初始化。象初始化。v 其声明格式为其声明格式为“ ( ( ););v 需求留意的是,构造函数的称号必需与类称号一样。构需求留意的是,构造函数的称号必需与类称号一样。构造函数没有任何的前往值,所以不能有前往类型,构造造函数没有任何的前往值,所以不能有前往类型,构造函数不能被声明为函数不能被声明为constconst类型。类型。第第5章章 类与对象类与对象构造函数的概念案例称号:构造函数的概念# include class Tdate privat
17、e:int month;public:Tdate()cout 自动调用构造函数 endl;void main()Tdate * b = new Tdate();delete b;第第5章章 类与对象类与对象构造函数的特点如下:构造函数的特点如下:v 1) 1) 构造函数是成员函数,函数体可写在类体内,也可定在类体构造函数是成员函数,函数体可写在类体内,也可定在类体外。外。2) 2) 构造函数是一个特殊的函数,构造函数是一个特殊的函数,v 该函数的名字与类名一样该函数的名字与类名一样; ;v 该函数不指定类型阐明该函数不指定类型阐明, ,它有隐含的前往值,该值由它有隐含的前往值,该值由系统内部运
18、用。系统内部运用。v 该函数可以一个参数,也可以有多个参数。该函数可以一个参数,也可以有多个参数。3)3)可以定义多个构造函数。即构造函数可以重载,也就是可以定可以定义多个构造函数。即构造函数可以重载,也就是可以定义多个参数个数不同的函数。义多个参数个数不同的函数。. .。v 4) 4) 程序中不能直接调用构造函数,在创建对象时系统自动调用程序中不能直接调用构造函数,在创建对象时系统自动调用构造函数。构造函数。第第5章章 类与对象类与对象重载构造函数重载构造函数 class Tdate private:int month;public:Tdate(int m)month = m;cout mo
19、nth endl;Tdate() month = 100;cout month endl;void main()Tdate * b = new Tdate(10); /调用调用Tdate(int m)函数函数delete b; Tdate * t = new Tdate(); /调用调用Tdate()函数函数delete b;第第5章章 类与对象类与对象(2)(2)析构函数的概念析构函数的概念 v析构函数也是一个特殊的成员函数,当析构函数也是一个特殊的成员函数,当deletedelete一个类对象的时候,会被系统自动调用。一个类对象的时候,会被系统自动调用。v析构函数并不是必需的。析构函数的函
20、数名和析构函数并不是必需的。析构函数的函数名和类名一样,并在前面加一个波浪号类名一样,并在前面加一个波浪号“,没有,没有任何参数,不前往任何值,声明格式为:任何参数,不前往任何值,声明格式为:“ “ ( ); ( );。 第第5章章 类与对象类与对象析构函数的运用案例称号:析构函数的运用# include class Tdate private:int month;public:Tdate()cout 自动调用构造函数 endl;Tdate()cout 自动调用析构函数 endl;void main()Tdate * b = new Tdate();delete b;第第5章章 类与对象类与对
21、象析构函数的特点如下:析构函数的特点如下:v 1 1析构函数是成员函数,函数体可写在类体内,也可定在类体外。析构函数是成员函数,函数体可写在类体内,也可定在类体外。v 2 2析构函数也是一个特殊的函数析构函数也是一个特殊的函数v 它的名字同类名,并在前面加它的名字同类名,并在前面加“字符,用来与构造函数加字符,用来与构造函数加以区别;以区别;v 析构函数不指定数据类型,并且也没有参数。析构函数不指定数据类型,并且也没有参数。v 3 3一个类中只能够定义一个析构函数。一个类中只能够定义一个析构函数。v 4 4析构函数可以被调用,也可以系统调用。在下面两种情况下,析构函析构函数可以被调用,也可以系
22、统调用。在下面两种情况下,析构函数会被自动调用。数会被自动调用。 假设一个对象被定义在一个函数体内,那么当这个函数终了时,假设一个对象被定义在一个函数体内,那么当这个函数终了时,该对象的析构函数被自动调用。该对象的析构函数被自动调用。 当一个对象是运用当一个对象是运用newnew运算符被动态创建的,在运用运算符被动态创建的,在运用deletedelete运算运算符释放它时,符释放它时,deletedelete将会自动调用析构函数。将会自动调用析构函数。第第5章章 类与对象类与对象缺省构造函数和缺省析构函数v 在类定义时没有定义任何构造函数时,那么编译器自动生成一个不带参数在类定义时没有定义任何
23、构造函数时,那么编译器自动生成一个不带参数的缺省构造函数,其格式如下:的缺省构造函数,其格式如下: :()() v v 同理,假设一个类中没有定义析构函数时,那么编译系统也生同理,假设一个类中没有定义析构函数时,那么编译系统也生成一个称为缺省析构函数,缺省析构函数是一个空函数,其格式如下:成一个称为缺省析构函数,缺省析构函数是一个空函数,其格式如下: : v 第第5章章 类与对象类与对象(3) (3) 类中常量和援用的初始化类中常量和援用的初始化v 上一小节讲述了运用析构函数对数据成员变量的初始上一小节讲述了运用析构函数对数据成员变量的初始化,那么如何初始化常量和援用?运用初始化表,化,那么如
24、何初始化常量和援用?运用初始化表,留意在类定义中不能直接用。留意在类定义中不能直接用。#includeclass initi_data private: int x; int ℞ const float pi; public: initi_data(int x1):rx(x),pi(3.14) x=x1; void display ( ) cout x= x , rx= rx , pi= pi endl; ; void main( ) initi_data ob(100); ob.display( ); 结果:结果: x= 100, rx=100, pi=3.14那么,从左边例子
25、中可以看出,初始化表的格式:构造函数:援用名变量,常量名常数, 第第5章章 类与对象类与对象4 4类类中中对对象成象成员员的初始化的初始化v 1. 1. 对象成员的概念对象成员的概念 C+ C+中允许将一个已定义的类的对象作为另一个类的数据中允许将一个已定义的类的对象作为另一个类的数据成员,这称为类的组合。当一个类的成员是某一个类的对象时,成员,这称为类的组合。当一个类的成员是某一个类的对象时,那么称该对象为对象成员或子对象那么称该对象为对象成员或子对象) )。如:。如:class Aclass A ;class Bclass B private:private: A a; A a; publ
26、ic:public: ; ; 在类中出现了子对象或称对象成员时,该类的构造函数要包含对子对象的初始化,通常采用成员初始化表的方法来初始化子对象。在成员初始化表中包含对子对象的初始化和对类中其他成员的初始化。第第5章章 类与对象类与对象组合类对象初始化语法格式组合类对象初始化语法格式v在创建一个组合类的对象时,不仅会调用它本在创建一个组合类的对象时,不仅会调用它本身的构造函数,而且还调用其对象成员的构造身的构造函数,而且还调用其对象成员的构造函数,调用顺序为先调用对象成员构造函数,函数,调用顺序为先调用对象成员构造函数,再执行本类构造函数的函数体。语法格式为:再执行本类构造函数的函数体。语法格式
27、为:v类名类名:类名形参表:内嵌对象类名形参表:内嵌对象1 1形参表,形参表,内嵌对象内嵌对象2 2形参表,形参表, v下面举一例子阐明成员初始化的构造。下面举一例子阐明成员初始化的构造。第第5章章 类与对象类与对象v #include #include class Aclass A private: private: int A1, A2; int A1, A2; public: public: A(int i, int j) A1=i; A(int i, int j) A1=i; A2=j; A2=j; void print() void print() coutA1“,coutA1“,A
28、2endl; A2endl; v ; ;class Bclass B private: private: A a; / A a; /对象成员对象成员 int b; int b;public:public: B(int i, int j, int B(int i, int j, int k):a(i, j), b(k)k):a(i, j), b(k) void print(); void print();void B:print() a.print(); coutbendl;void main() B b(6, 7, 8); b.print();该程序的输出结果为: 6,7 8第第5章章 类与对
29、象类与对象v 其中,其中,a(i, j), b(k)a(i, j), b(k)是成员初始化表,它有二项,前一项是成员初始化表,它有二项,前一项为哪一项给子对象为哪一项给子对象a a初始化,其格式如下:初始化,其格式如下: ( () 后一项为哪一项给类后一项为哪一项给类B B的数据成员的数据成员b b初始化。这一项也可初始化。这一项也可以写在构造函数的函数体内,运用赋值表达式语句以写在构造函数的函数体内,运用赋值表达式语句b = k;b = k; 给类给类B B的数据成员初始化。的数据成员初始化。第第5章章 类与对象类与对象5 5拷贝构造函数用对象给对象赋值拷贝构造函数用对象给对象赋值v 拷贝构
30、造函数的功能是用于实现对象值的拷贝,经过将一个同类拷贝构造函数的功能是用于实现对象值的拷贝,经过将一个同类对象的值拷贝给一个新对象,来完成对新对象的初始化,即用一对象的值拷贝给一个新对象,来完成对新对象的初始化,即用一个对象去构造另外一个对象。个对象去构造另外一个对象。v 拷贝构造函数是拷贝构造函数是C+C+中引入的一种新的构造函数。定义一个拷贝中引入的一种新的构造函数。定义一个拷贝构造函数的方式是:构造函数的方式是:v 类名类名const const 类名类名 & &方式参数方式参数v 函数体函数体 v 由此可看出:由此可看出:v 拷贝构造函数的称号与类的称号一样,且它只需一
31、个参数,该参拷贝构造函数的称号与类的称号一样,且它只需一个参数,该参数就是对该类对象的援用。数就是对该类对象的援用。第第5章章 类与对象类与对象v 在下述三种情况下,需求用拷贝初始化构造函数来用一个对象初在下述三种情况下,需求用拷贝初始化构造函数来用一个对象初始化另一个对象。始化另一个对象。 1 1明确表示由一个对象初始化另一个对象时,如:明确表示由一个对象初始化另一个对象时,如:TPoint TPoint P2(P1);P2(P1); 2 2当对象作为函数实参传送给函数形参时,如:上例当对象作为函数实参传送给函数形参时,如:上例 P = P = f(N);f(N); 3 3当对象用为函数前往
32、值时。当对象用为函数前往值时。v 假设类中没有阐明拷贝初始化构造函数,那么编译系统自动生成假设类中没有阐明拷贝初始化构造函数,那么编译系统自动生成一个具有上述方式的缺省拷贝初始化构造函数。作为该类的公有一个具有上述方式的缺省拷贝初始化构造函数。作为该类的公有成员。成员。第第5章章 类与对象类与对象实例拷贝构造函数实例拷贝构造函数v ExampleExample是一个人员信息类。用普通构造函数生成是一个人员信息类。用普通构造函数生成obj1obj1,用拷贝构造,用拷贝构造函数生成函数生成obj2obj2。v class Exampleclass Examplev private: private
33、:v char char * *name;name;v int num; int num; v public: public:v Example(int i, char Example(int i, char * *str ) / str ) / 构造函数定构造函数定义义v name=str; name=str;v num=i; num=i; v Example(const Example &x) / Example(const Example &x) / 拷贝构造函数定义拷贝构造函数定义v num=x.num; num=x.num; v void list() / void list() / 定义显定义显示函数示函数list list v cout cout数据成员数据成员numnum的值的值=numendlendl; =numendlendl; v ;第第5章章 类
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《天下国家》课件
- 《hp国内外研究进展》课件
- 《健康知识漫谈》课件
- 《人们怎么利用时间》课件
- 《艾滋病的基本知识》课件
- 二年级科学教科版课件《身体的“时间胶囊”》
- 城市总体规划合同(2篇)
- 主动脉夹层-课件
- 2022年安徽省六安市公开招聘警务辅助人员(辅警)笔试模拟自测题(C)卷含答案
- 2024年四川省内江市公开招聘警务辅助人员(辅警)笔试专项训练卷(2)含答案
- 煤矿公司掘进巷道贯通管理办法
- 技工学校毕业生登记表
- 降低故障工单回复不合格率
- 可涂色简笔画打印(共20页)
- 灯光架介绍及使用说明
- 十一学校行动纲要
- GB 1886.6-2016 食品安全国家标准 食品添加剂 硫酸钙(高清版)
- 关于房屋征收及土地收储过程中的税收政策(仅供参考)
- 唯一住房补贴申请书(共2页)
- 单面多轴钻孔组合机床动力滑台液压系统课程设计
- 中医养生脾胃为先PPT文档
评论
0/150
提交评论