




已阅读5页,还剩24页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1,四、析构函数 (destructor) 五、赋值运算符函数operator = 六、成员函数重载 七、缺省参量的成员函数 八、编译器默默提供的成员函数,第15章 特殊的成员函数,2,四、析构函数(destructor) 析构函数是类中的特殊成员函数。析构函数与构造函数 的作用相反,构造函数在对象的定义点由编译器自动调用, 析构函数则是在对象生存期结束时自动执行的成员函数。 析构函数的语法格式是在无参构造函数的构造函数名前 加以一个波浪符也即按位求反运算符,由此形成特殊的析 构函数名,表示“反构造函数”。 若没有提交析构函数,编译器暗中生成一个公共的缺省 析构函数,它是空函数。,3,析构函数在类中的声明和定义格式为: CType(); 析构函数名(); 类名(); /声明格式 CType:CType () 类名:类名() /定义格式 析构函数语句序列; /语句为空时对应缺省的析构函数 上面析构函数的定义放置在实现文件中,放在类的声明 中时写为: CType() 语句序列; 类名() 语句序列;,4,构造、析构函数和赋值运算符函数都不参入继承机制。 下面是析构函数的特殊之处: 1). 析构函数是唯一的,既没有入口参数也无返回类型, 因此不能重载。 2). 析构函数不能继承但可以是虚函数。 3). 析构函数体中不能使用return语句返回值。 4). new运算符定义的对象,delete运算符清除时导致 析构函数的隐含调用。,5,new运算符定义对象时new运算符先申请内存然后调用 构造函数。 由delete清除new运算符定义的对象时,则是先调用析 构函数,然后再收回原来由new运算符为对象分配的内存。 new CTypen运算分配内存大小是n*sizeof(CType), 并不包含其成员指针其后所间接在构造函数中进一步获得的 内存,这片内存应由析构函数先行释放。 new CTypen运算符与delete 匹配,new CType运 算符与delete 匹配,其余的搭配都是不稳健的,应避免。 匹配关系为CType *pk=new CType2;delete pk; 与 CType *p=new CType;.;delete p;。 delete运算符隐含调用析构函数时,在调用点相应的析 构函数应是可访问的。,6,例 对象定义与析构函数 #include static int numc=0; class CType public: CType (int=3 ); CType(); private: long * m_p ; int m_n; ; CType:CType (int n) m_n = n; printf (“%d, CType (); +%dn“, m_n, +numc); m_p = new long m_n; ,7,CType:CType () printf (“%d, CType (); %d-; “, m_n, numc- - ); delete m_p; CType g (1); CType *q = new CType (9); void main () /因此相应的析构函数未被调用 printf (“Enter into main() n“); CType d (2); CType *pk= new CType 2; delete pk; printf (“nGo outof main () n“); ,8,/程序运行输出结果: 1,CType();+1 9,CType();+2 Enter into main() 2,CType();+3 3,CType();+4 3,CType();+5 3,CType();5-; 3,CType();4-; Go outof main() 2,CType();3- 1,CType();2,9,说明: 全局对象的构造函数在进入主函数之前就被系统优先调 用,这是C+程序相对于C程序一个重要的突破。 析构函数按照与构造函数相反的次序隐含地被系统调 用,最先登陆构造的对象最后经过析构函数撤离现场。 程序5次调用构造函数,4次调用析构函数。,10,五、赋值运算符函数operator= 赋值运算符函数也称为等号运算符函数,赋值运算符的 函数原型为: B 函数原型说明一个函数名为operator=的运算符函 数,B:operator = 是这个函数的全限定名,表示: operator = 函数是属于类B的成员函数,圆括号包括的是 const B&型的入口形参。 B&是这个函数的返回类型,这是一个返回左值对象的 函数。因此该函数可以用于连续的赋值运算如a=b=c或 (a=b)=c。,11,例 赋值运算符函数与拷贝构造函数 #include #include class B private:int m_n; public: B (int v=1) Set (v); B (const B ,12,Bn=100,13,拷贝构造函数和等号赋值函数其内在机制是一样的, memcpy函数完成幕后数据拷贝。 等号语法a=d,d=a派生出两种语义,编译器根据周边氛 围确定调用合适的函数,在对象的定义点调用与初始化过程 相关的拷贝构造函数,在其余的环境调用等号赋值运算符函 数。,14,例 拷贝构造函数的隐含作用 class A public: A(int n) m_n=n; A() private: A (const A ,15,A类中拷贝构造函数声明为私有的,对象定义语句 A a=d; 等价于 A a(d);,a(d) 调用拷贝构造函数。 拷贝构造函数是私有的,定义语句导致外部访问私有的 成员,因而弹出错误提示。 在函数对象数值形参入口f (A a)和对象数值返回 return A(n) 时要求一个可访问的拷贝构造函数。 函数f (A a)是对象数值形参,调用f (b)引起拷贝构造函 数的调用,如果在虚实结合处不存在可访问的拷贝构造函 数,则导致错误提示。,16,六、成员函数重载 类中的成员函数如全局函数一样可以重载。析构函数是 唯一的,不能重载的函数是析构函数。 成员函数允许重载(overloading)其含义以两个重载函数 为例: type CType:funct (t1 v1, t2 v2, tn vn) 语句序列; type CType:funct (type3 v1, type4 v2, typem vn) 语句序列;,17,重载的成员函数是全限定名CType:funct相同形参列 表类型、个数、位置有所不同的成员函数。 成员函数重载在函数的调用点根据实参的类型和位置差 异在编译阶段确定。 CType:用于函数名的名称界定,因此另一个类中同名 的成员函数funct是绝然不同的函数,正是类域分辨符减少 了同名函数的混乱,这就是封装的优点。,18,例 CRect类中的重载函数SetRect #include #include class CRect public: long left; long top; long right; long bottom; CRect (int l=1, int t=2, int r=3, int b=4); void SetRect (int x1, int y1, int x2, int y2); void SetRect (const CRect,19,void CRect:Show () printf (“left=%d,top=%d,right=%d,bottom=%d;“, left,top,right,bottom) ; void CRect:SetRect (const CRect ,20,void CRect:SetRect (int l, int t, int right, int bottom) left = l; top = t; this-right = right; this-bottom = bottom; void main() CRect r,s; r.Show(); r.SetRect(5,6,7,8); s.SetRect(r); s.Show(); /输出: left=1,top=2,right=3,bottom=4; left=5,top=6,right=7,bottom=8,21,七、缺省参量的成员函数 缺省参量的函数是形参列表参量具有事先预定的值, 这 给编程带来的好处是: 首先提醒程序员合适的实参值大抵在什么范围; 其次缺省参量对于函数的使用提供了方便,只需将缺省 值作为实参带入函数就能得到一致的结果。 对于带有缺省值的如下函数原型: long CType:Set (int n, long m=10, short s=5); CType:CType (int n, long m=10, short s=5); 在不引起重载调用歧义的情况下存在如下等价的调用格 式: this- Set (7); this- Set (7, 10); this- Set (7, 10,5); CType a (7); CType a (7, 10); CType a (7, 10,5);,22,例 缺省参量的构造函数和成员函数 #include class CType long m; int n; short s; public: void Set(int n, long m=10, short s=5); CType (int n=1, long m=10, short s=5); void Show (); CType () ; void CType:Set (int n, long m, short s) this-n=n; this-m=m; this-s=s; CType:CType (int n, long m, short s) Set (n,m, s) ; void CType:Show() printf (“%d, %d, %d n“, n, m ,s); ,23,void main () CType* pthis =new CType(1); pthis-Set (7,10,5); pthis-Show (); pthis-Set (7,10); pthis-Show (); CType a (7,10,5); a.Show (); CType c (7,10); c.Show (); 为避免重载的歧义性,无参构造函数和全部设置缺省值 的构造函数只提交一个版本。虽然两者都提供并不算错,但 编译器提出警告。 对象定义CType b;既可以调用无参构造函数也可以调 用全部设置缺省值的构造函数;两者都是缺省构造函数。,24,八、编译器默默提供的成员函数 对一个简单的类声明 class CTypelong m_tData;, 编译器暗中提交无参构造函数、析构函数、拷贝构造函数、 赋值运算符函数以及一对取地址运算符函数。 取地址运算函数存在一个只读成员函数,该函数用 const关键此后置限定,用于取只读对象的地址。 这些成员函数是公共访问性质的,仅在程序调用时才隐 含生成不露声色。,25,编译器默默奉献的成员函数清单如下: #include #include class CType long m_tData; public: CType () CType () CType (const CType,26,int and=0; CType:CT
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- GB 16556-2025呼吸防护自给开路式压缩空气呼吸器
- GB 31975-2025呼吸防护压缩空气技术要求
- 2025内蒙古峰市教育科学研究中心竞争性比选教研员5人考前自测高频考点模拟试题附答案详解(考试直接用)
- 2025黑龙江双鸭山市友谊县招聘就业见习人员考前自测高频考点模拟试题及答案详解(名师系列)
- 2025年南平邵武市立医院护理岗位招聘模拟试卷及1套完整答案详解
- 2025河南安阳市龙安区人社局招聘7名模拟试卷及参考答案详解
- 2025河南推拿职业学院招聘6人考前自测高频考点模拟试题及完整答案详解1套
- 2025年中国混凝土减水剂行业市场分析及投资价值评估前景预测报告
- 2025年福建省南平市光泽县招聘医疗人才10人考前自测高频考点模拟试题及完整答案详解
- 2025年合肥市第二人民医院招聘72人模拟试卷及答案详解(名师系列)
- 建设工程管理类专业认知
- 蓝豚医陪陪诊服务发展研究报告2025
- Lesson 22 The Giant (Ⅰ)教案 2023-2024学年冀教版九年级英语全册
- 社会责任班会课件
- 富士康车间生产管理制度
- 公众号文章培训:提升写作技巧与个人风格
- 《水浒传》人物专题系列-鲁智深
- 星间链路抗干扰策略-洞察分析
- 江苏省保安员考试练习100题及答案
- 大学生职业生涯规划与就业指导知到智慧树章节测试课后答案2024年秋西南民族大学
- 友情留言句子
评论
0/150
提交评论