005构造函数与析构函数.doc_第1页
005构造函数与析构函数.doc_第2页
005构造函数与析构函数.doc_第3页
005构造函数与析构函数.doc_第4页
005构造函数与析构函数.doc_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

构造函数与析构函数一、构造函数1构造函数:特殊的类成员函数,主要用于为对象分配空间,进行初始化。 特点:(1)必须与类同名。(2)不能指定返回类型。(3)可以写在函数体内或外。(4)可以重载。(5)即使构造函数是公有的,也不能被显式地调用,它是定义对象时被自动调用的。 (6)构造函数也可以是不带参数的。2构造函数的声明格式: 函数名(参数表);函数名必须与类同名。带缺省值的构造函数: 函数名(类型 参数=默认值,类型 参数=默认值);构造函数的实现: 类名:函数名(参数表) 语句序列;3用构造函数直接创建对象格式: 类名 对象名(实参表);声明构造函数时,参数没有缺省值,则定义对象时必须给出实参。4构造函数与指针、new结合创建对象格式: 类名 *指针变量=new 类名(实参表);5缺省的构造函数 如果定义类时没有定义构造函数,则系统自动生成一个缺省的构造函数: 格式:类名:缺省构造函数名() 功能: 为对象开辟一个存储空间,但不初始化。 由于用户一旦定义了构造函数,系统将不再提供缺省构造函数,因此,可以定义一个无参的构造函数以提高程序的健壮性:一个有错的程序:#include iostream.hclass Date public: Date(int y,int m,int d); /Date()或增加缺省值 void setDate(int y,int m,int d); void showDate(); private: int year,month,day;Date:Date(int y,int m,int d) year=y; month=m; day=d;void Date:setDate(int y,int m,int d) year=y; month=m; day=d;void Date:showDate() coutyear.month.dayendl;main() Date date1; date1.setDate(1997,3,23); date1.showDate();6重载构造函数 构造函数可以重载,只需参数可区分。7类中有指针数据成员时的构造函数与初始化函数二、析构函数1析构函数 一种特殊的类成员函数,它执行与构造函数相反的操作,用于撤消对象时的一些清理任务,释放分配给对象的内存空间。 特点:(1)没有参数,没有返回值,不能重载,一个类中只能有一个析构函数。(2)撤消对象时,系统自动调用析构函数。2析构函数的声明格式:函数名()函数名与类同名。三、拷贝构造函数用已经存在的对象建立新对象或函数调用时函数参数为对象且是值传递类型时,需要调用的函数。当类中没有显示声明拷贝构造函数,系统会提供默认的拷贝构造函数。#include iostream.hclass stu private: char *name; public: stu()cout调用了无参构造函数endl; stu(char*); stu(stu &); stu(); void init(char *); void out();stu:stu(char *n)cout调用了有参构造函数endl; name=new charstrlen(n)+1; strcpy(name,n); stu:stu(stu &ss)cout调用了拷贝构造函数endl; name=new charstrlen()+1; strcpy(name,);stu:stu()cout调用了析构函数endl;cout析构了nameendl; delete name;void stu:init(char *p)name=new charstrlen(p)+1; strcpy(name,p); void stu:out() coutnameendl; main() stu s(jack);stu s2(s); /s2=s; 这种方式不会调用自定义的拷贝构造函数 s2.out(); cout主程序的最末endl;四、深拷贝与浅拷贝四、练习1在下面有关对构造函数的描述中,正确的是: ( )A.构造函数可以带有返回值B.构造函数的名字与类名完全相同C.构造函数必须带有参数D.构造函数必须定义,不能缺省2 在声明类时,下面的说法正确的是:A.可以在类的声明中给数据成员赋初值B.数据成员的数据类型可以是registerC.prvate,public,protected可以按任意顺序出现D.没有用prvate,public,protected定义的数据成员是公有成员3 在下面有关析构函数特征的描述中,正确的是: ( )A.一个类中可以定义多个析构函数B.析构函数名与类名完全相同C.析构函数不能指定返回类型D.析构函数可以有一个或多个参数4 构造函数是在-时被执行的。 ( )A.程序编译 B.创建对象 C.创建类 D.程序装入内存5指出下列程序中的错误,并说明为什么。#includeclass Student char name10; int age; float aver; void printStu();void main() Student p1,p2,p3; p1.age=30; /.6指出下列程序中的错误,并说明为什么#include class student int sno; int age; void printstu(); void setsno(int d);void printStu() cout”nstudent No,is”sno”,”;cout”age is”age”.”endl;void setsno (int s)sno=s;void setAge (int a)age=a; void main () student lin; lin.setSno (20021); lin.setAge (20); lin.printStu(); 7指出下列程序中的错误,并说明为什么。#include class Pointpublic: int x,y;private: Point()x=1;y=2;void main() Point cpoint; cpoint.x=2;8指出下列程序中的错误,并说明为什么。#include class Stackpublic: Stack(int sz);private: char *p;int size;Stack:Stack(int sz) p=new charsize=sz;void main() Stack stt; /9下面是一个计算器类的定义,请完成该类成员函数的实现。class counterpublic: counter(int number); void increment(); /给原值加1 void decrement(); /给原值减1 int getvalue(); /取得计算器值 int print(); /显示计数private: int value;10.根据注释语句的提示,实现类Date的成员函数.#invlude class Date public: void printDate(); /显示日期void setDay(int d); /设置日的值void setMonth(int m); /设置月的值void setYear(int y); /设置年的值private: int day,month,year;void main() Date testDay; testDay.setDay(5); testDay.setMonth(10); testDay.setYear(2003); testDay.printDate();11下面定义了一个类date,根据主程序的提示,实现重载构造函数date().#include #include class datepublic: date(int m,int d,int d,int y); date:date(); void show();private:int day,month,year;void date:show() coutmonth/day/; coutyear”n”;main() date idate(12,2,1998); /构造函数的参数为3个整数 date indate; /构造函数没有参数,为数据通过键盘直接输入 sdate.show(); idate.show(); indate.show(); return 0;12建立类cylinder的构造函数需传递

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论