版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、ch3 关于类和对象的进一步关于类和对象的进一步讨论讨论3.1 构造函数构造函数3.2 析构函数析构函数3.3 调用构造函数和析构函数的顺序调用构造函数和析构函数的顺序3.4 对象数组对象数组3.5 对象指针对象指针3.6 共用数据的保护共用数据的保护3.7 对象的动态建立和释放对象的动态建立和释放3.8 对象的赋值和复制对象的赋值和复制3.9 静态成员静态成员3.10 友元友元3.11 类模板类模板目目 录录3.1.1 对象的初始化对象的初始化3.1.2 构造函数的作用构造函数的作用3.1.3 带参数的构造函数带参数的构造函数3.1.4 用参数初始化表对数据成员初始化用参数初始化表对数据成员
2、初始化3.1.5 构造函数的重载构造函数的重载3.1.6 使用默认参数的构造函数使用默认参数的构造函数3.1 构造函数构造函数对象是一个实体,反映了客观事物的属性对象是一个实体,反映了客观事物的属性eg时钟的时分秒值,是应该有确定值的。时钟的时分秒值,是应该有确定值的。3.1.1 对象的初始化对象的初始化class Time hour=0; minute=0; sec=0;类的数据成员不能类的数据成员不能在定义类时初始化。在定义类时初始化。case: 类是一种抽象类类是一种抽象类型,不占存储空间,不型,不占存储空间,不能存储数据。能存储数据。方法:构造函数3.1.2 构造函数的作用构造函数的作
3、用C+中一种中一种特殊的成员函数特殊的成员函数;其作用;其作用是是在创立对象时,在创立对象时,使用给定的值来将使用给定的值来将对象初始化对象初始化。特点:特点:系统约定构造函数名必须与类名一样系统约定构造函数名必须与类名一样,自动执,自动执行;不具有任何类型,不返回任何值;行;不具有任何类型,不返回任何值;可以带参数、可以可以带参数、可以重载重载,同时没有返回值。,同时没有返回值。类名形参表类名形参表 ;假如一个类没有定义构造函数,编译器会自编译器会自动生成一个不带参数的默认构造函数动生成一个不带参数的默认构造函数,其格式如下::在程序中定义一个对象而没有指明初始化时,编译器便按默认构造函数来
4、初始化该对象。 #includeusing namespace std;class Apublic:A /缺省的构造函数,编译器自动产生,可以不写float Sumvoid;void Setfloat=5,float=10.5; void Printvoid;private:float x,y;float A:Sumvoid return x+y; void A:Setfloat a,float b x=a;y=b;void A:Printvoid coutx=xty=yendl; void mainvoid A a1,a2;/产生对象时,自动调用缺省的构造函数,不赋值a1.Set;a1.Pr
5、int;a1.Set2.0,4.0;couta1: ; a1.Print;couta1.sum=a1.Sum endl;a2.Print;/打印随机值使用具有缺省参数的函数时,应注意以下几点:使用具有缺省参数的函数时,应注意以下几点:1.不可以靠左边缺省不可以靠左边缺省 2.函数原型说明时可以不加变量名函数原型说明时可以不加变量名 float vfloat,float=10,float=20;int areaint long , int width=2int areaint long =4, int width3.只能在前面定义一次缺省值只能在前面定义一次缺省值,即原型说明时定义了缺省,即原型
6、说明时定义了缺省值,后面函数的定义不可有缺省值。值,后面函数的定义不可有缺省值。错误!错误!#includeusing namespace std;class Apublic:A ;float Sumvoid;void Setfloat=5,float=10.5; void Printvoid;private:float x,y;A:A x=3; y=7; /对构造函数的重载对构造函数的重载float A:Sumvoid return x+y; void A:Setfloat a,float b x=a;y=b;void A:Printvoid coutx=xty=yendl; 类中定义构造类
7、中定义构造成员函数。成员函数。void mainvoid A a1,a2;/产生对象时,同时调用构造函数a1.Aa1.Set;a1.Print;a1.Set2.0,4.0;couta1: ; a1.Print;couta1.sum=a1.Sum endl;a2.Print;/打印对象初始值当创立对象时,系统自动调用构造函数,不能在程序当创立对象时,系统自动调用构造函数,不能在程序中直接调用。中直接调用。何时调用构造函数?何时调用构造函数?a1.A ; /错误错误 A a1; /产生对象时,产生对象时,同时同时调用构造函数调用构造函数a1.A 3.1.3 带参数的构造函数带参数的构造函数作用:不
8、同对象赋予不同初值。作用:不同对象赋予不同初值。初值何时给出?初值何时给出?定义对象时给出定义对象时给出P72 书例3.2 初始化时,构造函数可用两种方式把值赋给初始化时,构造函数可用两种方式把值赋给成员成员:1承受该值作为参量,并在构造函数体内赋给其成员。例如:class X int a, b ;/ 默认为 private 成员 public: X int i , int j a = i ; b = j ; #includeusing namespace std;#includeusing namespace std;class Apublic:/A /缺省的构造函数Ax=3,y=7;/构造
9、函数的重载Afloat ,float ; /重载的构造函数,编译器自动产生,可以不写float Sumvoid; void Printvoid;private:float x,y;/格式形如:数据成员形参A:Afloat a,float b:xa,yb /对构造函数的重载float A:Sumvoid return x+y; void A:Printvoid coutx=xty=yendl; int main A x10,20;/带参构造函数coutx.Sumendl;x.Print;A y; /无参构造函数y.Print;return 0;2使用函数体前的初值表冒号语法例如:代替函数体内对一
10、般成员赋值例如。class X int a, b ; public: X int i , int j : a i , b j 格式形如:数据成员形参数据成员形参3.1.5 构造函数的重载构造函数的重载构造同前:构造同前:C+允许在同一作用域中,用允许在同一作用域中,用同一函数名同一函数名定义多个函数,这些函数的定义多个函数,这些函数的参数个数参数个数or参数类型不一样参数类型不一样,用来实现不同功能用来实现不同功能“一物多用一物多用。作用:作用:对象支持多种初始化方案对象支持多种初始化方案,根据构造函数调用,根据构造函数调用形式形式由对象定义方式决定由对象定义方式决定选择生效。选择生效。P74
11、 书例3.3Box box1; /不指定实参无参不指定实参无参it 或。或。Box box115,20,30; /指定指定3个参数个参数无参的构造函数属于无参的构造函数属于默认构造函数默认构造函数/缺省构造函数缺省构造函数。一个类只有一个默认构造函数,那么带参构造函数数目呢?一个类只有一个默认构造函数,那么带参构造函数数目呢?建立对象时,执行构造函数的数目呢?建立对象时,执行构造函数的数目呢?反之,默认构造函数即无参构造函数吗?反之,默认构造函数即无参构造函数吗?考虑:考虑:参见参见P77: 全部参数都指定了默认值的构全部参数都指定了默认值的构造函数也属于造函数也属于默认构造函数默认构造函数。
12、 3.1.6 使用默认参数的构造函使用默认参数的构造函数数对象的初始化已提供方案:对象的初始化已提供方案:1、定义带参、定义带参构造函数构造函数定义对象时,实参传递定义对象时,实参传递 eg Box box215,20,30;2、定义无参构造函数、定义无参构造函数函数体内指定值函数体内指定值eg Box height=10;width=10;length=10;第三种方案:使用默认参数的构造函数。第三种方案:使用默认参数的构造函数。注意:默认参数构造函数与重载构造注意:默认参数构造函数与重载构造函数不能共存!函数不能共存! 提问:why默认参数构造函数与重载构造默认参数构造函数与重载构造函数不
13、能共存函数不能共存? 练习章后习题练习章后习题2,3 3.2 析构函数析构函数亦是亦是C+中一种中一种特殊的成员函数特殊的成员函数;其作用与构造函数;其作用与构造函数相反,在撤销对象占用的内存之前完成一些清理工作,相反,在撤销对象占用的内存之前完成一些清理工作,便便于它用。于它用。特点:特点:函数名函数名是类名前加一取反符是类名前加一取反符“,无类型,无类型,无无参数参数,不返回任何值,不,不返回任何值,不能被重载能被重载;对象生命期完毕时,;对象生命期完毕时,自动执行。自动执行。作用:作用:释放资源释放资源;执行;执行“用户希望在最后一次使用对用户希望在最后一次使用对象之后所执行的任何操作,
14、如输出象之后所执行的任何操作,如输出假如一个类没有定义析构函数,编译器会自编译器会自动生成一个默认动生成一个默认析构析构函数函数,其格式如下:: .class Studentpublic:Student int n,string nam,char s num=n;name=nam;sex=s; coutConstructor called.endl; Student coutDestructor called.endl; void displaycountnum:numendl; countname:nameendl; countsex:sexendlendl; private:int num
15、; string name;char sex;.int mainStudent stud110010,Wang_li,f; stud1.display;Student stud210011,Zhang_feng,m; stud2.display;分析执行过程分析执行过程 3.3 调用构造函数和析构函数的顺序调用构造函数和析构函数的顺序先构造的后析构,后构造的先析构。先构造的后析构,后构造的先析构。 3.8 对象的赋值与复制对象的赋值与复制1 对象的赋值对象的赋值 同类的对象间可以直接赋值同类的对象间可以直接赋值类中所有数据成员的值。类中所有数据成员的值。 注意:注意:1、对象的赋值仅针对数据成
16、员,不对成员函数。、对象的赋值仅针对数据成员,不对成员函数。2、类的数据成员中不能包含动态分配的数据。、类的数据成员中不能包含动态分配的数据。 格式:格式: 对象名对象名1=对象名对象名2; Box box115,30,25,box2;box2=box1;3.8 对象的赋值与复制对象的赋值与复制2 对象的复制对象的复制 那么此方式复制建立新的对象时,系统调用了一个特殊那么此方式复制建立新的对象时,系统调用了一个特殊的构造函数的构造函数复制构造函数。复制构造函数。 Box:Boxconst Box&b /常对象引用形式常对象引用形式height=b.ehight;width=b.widt
17、h;length=b.length; 格式:格式: 类名类名 对象名对象名2对象名对象名1; N-O or 类名类名 对象名对象名1=对象名对象名2; 复制构造函数复制构造函数特点:一个常对象引用参数特点:一个常对象引用参数-只引用值,无修改权只引用值,无修改权作用:将实参对象的数据成员值,对应赋值给新对象。作用:将实参对象的数据成员值,对应赋值给新对象。3.8 对象的赋值与复制对象的赋值与复制普通构造函数与复制构造函数的区别普通构造函数与复制构造函数的区别 1形式不同形式不同类名形参表列;类名形参表列;类名类名类名类名&对象名;对象名;2实参类型不同 常量值/ 对象名3调用时机A 普
18、构建立对象时B 复构已有对象复制新对象时1、对象复制、对象复制2、类对象作为函数参数,调用之,虚实结合时、类对象作为函数参数,调用之,虚实结合时3、函数的返回值是类对象,返回时,虚实结合、函数的返回值是类对象,返回时,虚实结合P118 83.10 友元友元 friendclass Timepublic: Timeint,int,int; friend void displayTime & /声明声明display函数为函数为Time类的友元函类的友元函数数 private: . /以下数据是私有数据成员以下数据是私有数据成员;void displayTime& t /这是友元函
19、数,形参这是友元函数,形参t是是Time类对象的引类对象的引用用coutt.hour:t.minute:t.secendl;概念:概念: 友元可以访问与其有好友关系的类中的私有成员,包友元可以访问与其有好友关系的类中的私有成员,包含含友元函数友元函数和和友元类友元类。 3.10 友元友元 friendclass Timepublic: Timeint,int,int; friend void displayTime & /声明声明display函数为函数为Time类的友元函类的友元函数数 private: . /以下数据是私有数据成员以下数据是私有数据成员;void displayTi
20、me& t /这是友元函数,形参这是友元函数,形参t是是Time类对象的引类对象的引用用coutt.hour:t.minute:t.secendl;概念:概念: 友元可以访问与其有好友关系的类中的私有成员,包友元可以访问与其有好友关系的类中的私有成员,包含友元函数和友元类。含友元函数和友元类。 格式:格式: friend 类类 或或 函数函数 声明声明3.10 友元友元 friendclass Radius /半径半径 friend class Circle; /声明声明Circle为为Radius的友元类的友元类 friend void Show_rRadius &n; /声
21、明声明Show_r为友元函数为友元函数 public: Radiusint x r = x; private: int r;void Show_rRadius &n cout圆的半径为圆的半径为: n.rendl; /调用调用Radius对象的私有成员变量对象的私有成员变量r概念:概念: 友元可以访问与其有好友关系的类中的私有成员,包友元可以访问与其有好友关系的类中的私有成员,包含友元函数和友元类。含友元函数和友元类。 class Circle public: double areaRadius a s = a.r * a.r * 3.1415926; /调用调用Radius对象的私有
22、成员变量对象的私有成员变量r return s; private: double s;3.10 友元友元 friend代码实现过程:代码实现过程: 该类外定义一个函数二者之一,该类外定义一个函数二者之一, 该类中作一友元函数声明,该类中作一友元函数声明,eg friend void displayTime& 那么那么此函数此函数与该类建立关联与该类建立关联friend,可以访问类内私可以访问类内私有成员。有成员。1 友元函数友元函数 一个类的友元函数可以访问这个类中的私有成员;一个类的友元函数可以访问这个类中的私有成员;可以是可以是普通函数普通函数,还可以是,还可以是另一类中另一类中的
23、的成员函数成员函数。3.9 静态成员静态成员特点:特点:在友元普通函数中引用该类私有数据成员时,必须加在友元普通函数中引用该类私有数据成员时,必须加上对象名,所以上对象名,所以一定是带参函数一定是带参函数形参为类对象。形参为类对象。 形如:形如: void displayTime &tA 友元普通函数友元普通函数 3.10 友元友元 friendP108 eg3.123.9 静态成员静态成员补充:补充:类的提早引用声明类的提早引用声明C+特别允许,在类声明前作一个类的提早引用声明,特别允许,在类声明前作一个类的提早引用声明,可以提早使用该类,用来解决类间引用的可以提早使用该类,用来解决类间引用的“连环套问题。连环套问题。格式:格式:class 类名;类名;特点:只提供类名,不包含类体;不能定义类对象。特点:只提供类名,不包含类体;不能定义类对象。 如:如: class Date; class d1; /定义类对象,定义类对象, error!B 友元成员函数友元成员函数 3.10 友元友元 friendP109 eg3.133.10 友元友元 friend1 友元函数友元函数 一个函数可以被多个类声明为一个函数可以被多个类声明为“朋友,那么可朋友,那么可以引用多个类中的私有数据。以引用多个类中的私有数据。上机改动上机改动eg3.13,实现之
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 漯河食品职业学院《机械工程材料与成形技术》2023-2024学年第一学期期末试卷
- 2024年版:版权许可及发行外包合同2篇
- 2025签订房屋租赁合同要审查哪些要点
- 2024年标准个人汽车短期租赁协议范本版
- 单位人事管理制度范例合集
- 旅游挑战之旅服务合同
- 外墙修复工程安全协议
- 娱乐产业合同工管理方案
- 2024年标准化园林材料采购合同版B版
- 2024双方智能电网建设与运营合作承诺书3篇
- 人才公寓建设实施计划书
- 2024传染病预防ppt课件完整版
- 新教材苏教版三年级上册科学全册单元测试卷
- 病理性跳楼的心理咨询技巧与方法
- 2024年内蒙古能源集团有限公司招聘笔试参考题库含答案解析
- 精神疾病护理常规课件
- 2024年中煤平朔发展集团招聘笔试参考题库含答案解析
- 2024年国家电投招聘笔试参考题库含答案解析
- 读蔬项目定位方案
- 原子发射光谱法
- 投标报价得分计算表Excele
评论
0/150
提交评论