




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、c构造函数与析构函数 第十章第十章 构造函数和析构函数构造函数和析构函数 c构造函数与析构函数 构造函数和析构函数是在类体中说明的两种构造函数和析构函数是在类体中说明的两种 特殊的成员函数。特殊的成员函数。 构造函数是在创建对象时,使用给定的值来构造函数是在创建对象时,使用给定的值来 将对象初始化。将对象初始化。 析构函数的功能正好相反,是在系统释放对析构函数的功能正好相反,是在系统释放对 象前,对对象做一些善后工作。象前,对对象做一些善后工作。 c构造函数与析构函数 构造函数是类的成员函数,系统约定构造函构造函数是类的成员函数,系统约定构造函 数名必须与类名相同。构造函数提供了初始数名必须与
2、类名相同。构造函数提供了初始 化对象的一种简单的方法。化对象的一种简单的方法。 构造函数可以带参数、可以重载,同时没有构造函数可以带参数、可以重载,同时没有 返回值。返回值。 c构造函数与析构函数 class A float x,y; public: A(float a,float b) x=a; y=b;/构造函数,初始化对象构造函数,初始化对象 float Sum(void) return x+y; void Set(float a,float b) x=a;y=b; Print(void) coutx=xty=yendl; ; void main(void) A a1(2.0, 3.0)
3、;/定义时调用构造函数初始化定义时调用构造函数初始化 A a2(1.0,2.0); a2.Set(10.0, 20.0); /利用成员函数重新为对象赋值利用成员函数重新为对象赋值 a1.Print(); a2.Print(); c构造函数与析构函数 对构造函数,说明以下几点:对构造函数,说明以下几点: 1.构造函数的函数名必须与类名相同。构造构造函数的函数名必须与类名相同。构造 函数的主要作用是完成初始化对象的数据成函数的主要作用是完成初始化对象的数据成 员以及其它的初始化工作。员以及其它的初始化工作。 2. 在定义构造函数时,不能指定函数返回值在定义构造函数时,不能指定函数返回值 的类型,也
4、不能指定为的类型,也不能指定为void类型。类型。 3. 一个类可以定义若干个构造函数。当定义一个类可以定义若干个构造函数。当定义 多个构造函数时,必须满足函数重载的原则。多个构造函数时,必须满足函数重载的原则。 c构造函数与析构函数 4.构造函数可以指定参数的缺省值。构造函数可以指定参数的缺省值。 5.若定义的类要说明该类的对象时,构造函若定义的类要说明该类的对象时,构造函 数必须是公有的成员函数。如果定义的类仅数必须是公有的成员函数。如果定义的类仅 用于派生其它类时,则可将构造函数定义为用于派生其它类时,则可将构造函数定义为 保护的成员函数。保护的成员函数。 由于构造函数属于类的成员函数,
5、它对私有由于构造函数属于类的成员函数,它对私有 数据成员、保护的数据成员和公有的数据成数据成员、保护的数据成员和公有的数据成 员均能进行初始化员均能进行初始化。 c构造函数与析构函数 class A float x,y; public: A(float a, float b=10) x=a; y=b; A() x=0; y=0; void Print(void) coutxtyendl; ; void main(void) A a1, a2(20.0), a3(3.0, 7.0); a1.Print(); a2.Print(); a3.Print(); 00 2010 37 带缺省参数的构造函
6、数带缺省参数的构造函数 不带参数的构造函数不带参数的构造函数 每一个对象必每一个对象必 须要有相应的须要有相应的 构造函数构造函数 c构造函数与析构函数 每一个对象必须要有相应的构造函数每一个对象必须要有相应的构造函数 若没有显式定义构造函数,若没有显式定义构造函数, 系统默认缺省的构造函数。系统默认缺省的构造函数。 class A float x,y; public: A() void Print(void) coutxtyendl; ; 隐含的缺省的构造函数隐含的缺省的构造函数 A a1, a2; 只允许这样定义对象只允许这样定义对象 对象开辟了空间,但没有初始化对象开辟了空间,但没有初始
7、化 c构造函数与析构函数 对局部对象,静态对象,全局对象的初始化对局部对象,静态对象,全局对象的初始化 对于局部对象,每次定义对象时,都要调用对于局部对象,每次定义对象时,都要调用 构造函数。构造函数。 对于静态对象,是在首次定义对象时,调用对于静态对象,是在首次定义对象时,调用 构造函数的,且由于对象一直存在,只调用构造函数的,且由于对象一直存在,只调用 一次构造函数。一次构造函数。 对于全局对象,是在对于全局对象,是在main函数执行之前调用函数执行之前调用 构造函数的。构造函数的。 c构造函数与析构函数 class A int x,y; public: A(int a) x=a; cou
8、t“1n”; A(int a, int b) x=a,y=b;cout“2n”; ; A a1(3); void f(void) A b(2,3); void main(void) A a2(4,5); f(); f(); 1 2 2 2 c构造函数与析构函数 class A float x,y; public: A(float a, float b)x=a;y=b;cout初始化自动局部对象初始化自动局部对象n; A() x=0; y=0; cout初始化静态局部对象初始化静态局部对象n; A(float a) x=a; y=0; cout初始化全局对象初始化全局对象n; void Prin
9、t(void) coutxtyendl; ; A a0(100.0);/定义全局对象定义全局对象 void f(void) cout 进入进入f()函数函数n;A a2(1,2); static A a3; /初始化局部静态对象初始化局部静态对象 void main(void) cout进入进入main函数函数n; A a1(3.0, 7.0);/定义局部自动对象定义局部自动对象 f(); f(); 初始化全局对象初始化全局对象 进入进入main函数函数 初始化自动局部对象初始化自动局部对象 进入进入f()函数函数 初始化局部静态变量初始化局部静态变量 进入进入f()函数函数 初始化自动局部对
10、象初始化自动局部对象 初始化自动局部对象初始化自动局部对象 c构造函数与析构函数 缺省的构造函数缺省的构造函数 在定义类时,若没有定义类的构造函数,则编在定义类时,若没有定义类的构造函数,则编 译器自动产生一个缺省的构造函数,其格式为:译器自动产生一个缺省的构造函数,其格式为: className:className() 缺省的构造函数并不对所产生对象的数据成员缺省的构造函数并不对所产生对象的数据成员 赋初值;即新产生对象的数据成员的值是不确定赋初值;即新产生对象的数据成员的值是不确定 的。的。 c构造函数与析构函数 class A float x,y; public: A()/缺省的构造函数
11、,编译器自动产生缺省的构造函数,编译器自动产生,可以不写可以不写 float Sum(void) return x+y; void Set(float a,float b) x=a;y=b; void Print(void) coutx=xty=yendl; ; void main(void) A a1,a2;/产生对象时,自动调用缺省的构造函数,不赋值产生对象时,自动调用缺省的构造函数,不赋值 a1.Set (2.0,4.0); couta1: ; a1.Print (); couta1.sum=a1.Sum ()endl; a2.Print();/打印随机值打印随机值 c构造函数与析构函数
12、 关于缺省的构造函数,说明以下几点:关于缺省的构造函数,说明以下几点: 1、在定义类时,只要显式定义了一个类的构、在定义类时,只要显式定义了一个类的构 造函数,则编译器就不产生缺省的构造函数造函数,则编译器就不产生缺省的构造函数 2、所有的对象在定义时,必须调用构造函数、所有的对象在定义时,必须调用构造函数 不存在没有构造函数的对象!不存在没有构造函数的对象! c构造函数与析构函数 class A float x,y; public: A(float a,float b)x=a; y=b; void Print(void)coutxtyendl; ; void main(void) A a1;
13、 A a2(3.0,30.0); 显式定义了构造函数,不显式定义了构造函数,不 产生缺省的构造函数产生缺省的构造函数 error,定义时,没有定义时,没有 构造函数可供调用构造函数可供调用 c构造函数与析构函数 3、在类中,若定义了没有参数的构造函数,或、在类中,若定义了没有参数的构造函数,或 各参数均有缺省值的构造函数也称为缺省的构造各参数均有缺省值的构造函数也称为缺省的构造 函数,缺省的构造函数只能有一个。函数,缺省的构造函数只能有一个。 4、产生对象时,系统必定要调用构造函数。所以、产生对象时,系统必定要调用构造函数。所以 任一对象的构造函数必须唯一。任一对象的构造函数必须唯一。 c构造
14、函数与析构函数 class A float x,y; public: A(float a=10,float b=20)x=a; y=b; A() void Print(void)coutxtyendl; ; void main(void) A a1; A a2(3.0,30.0); 两个函数均为缺两个函数均为缺 省的构造函数省的构造函数 两个构造函数均可供调用,构造函数不唯一两个构造函数均可供调用,构造函数不唯一 c构造函数与析构函数 构造函数与构造函数与new运算符运算符 可以使用可以使用new运算符来动态地建立对象。建立运算符来动态地建立对象。建立 时要自动调用构造函数,以便完成初始化对象
15、的时要自动调用构造函数,以便完成初始化对象的 数据成员。最后返回这个动态对象的起始地址。数据成员。最后返回这个动态对象的起始地址。 用用new运算符产生的动态对象,在不再使用这运算符产生的动态对象,在不再使用这 种对象时,必须用种对象时,必须用delete运算符来释放对象所占用运算符来释放对象所占用 的存储空间。的存储空间。 用用new建立类的对象时,可以使用参数初始化建立类的对象时,可以使用参数初始化 动态空间。动态空间。 c构造函数与析构函数 class A float x,y; public: A(float a, float b)x=a;y=b; A()x=0; y=0; void P
16、rint(void) coutxtyPrint(); pa2-Print(); delete pa1; /用用delete释放空间释放空间 delete pa2; /用用delete释放空间释放空间 5 0 0 c构造函数与析构函数 析构函数析构函数 析构函数的作用与构造函数正好相反,是在对象的生析构函数的作用与构造函数正好相反,是在对象的生 命期结束时,释放系统为对象所分配的空间,即要撤消一命期结束时,释放系统为对象所分配的空间,即要撤消一 个对象。个对象。 析构函数也是类的成员函数,定义析构函数的格式为:析构函数也是类的成员函数,定义析构函数的格式为: ClassName:ClassNam
17、e( ) . / 函数体函数体; c构造函数与析构函数 析构析构 函数的特点如下:函数的特点如下: 1、析构函数是成员函数,函数体可写在类体内,、析构函数是成员函数,函数体可写在类体内, 也可写在类体外。也可写在类体外。 2、析构函数是一个特殊的成员函数,函数名必须、析构函数是一个特殊的成员函数,函数名必须 与类名相同,并在其前面加上字符与类名相同,并在其前面加上字符“”,以便和构,以便和构 造函数名相区别。造函数名相区别。 3、析构函数不能带有任何参数,不能有返回值,、析构函数不能带有任何参数,不能有返回值, 不指定函数类型。不指定函数类型。 c构造函数与析构函数 在程序的执行过程中,当遇到
18、某一对象的生存期在程序的执行过程中,当遇到某一对象的生存期 结束时,系统自动调用析构函数,然后再收回为结束时,系统自动调用析构函数,然后再收回为 对象分配的存储空间。对象分配的存储空间。 4、一个类中,只能定义一个析构函数,析构函数、一个类中,只能定义一个析构函数,析构函数 不允许重载。不允许重载。 5、析构函数是在撤消对象时由系统自动调用的。、析构函数是在撤消对象时由系统自动调用的。 c构造函数与析构函数 class A float x,y; public: A(float a,float b) x=a;y=b;cout调用非缺省的构造函数调用非缺省的构造函数n; A() x=0; y=0;
19、 cout调用缺省的构造函数调用缺省的构造函数n ; A() cout调用析构函数调用析构函数n; void Print(void) coutxtyendl; ; void main(void) A a1; A a2(3.0,30.0); cout退出主函数退出主函数n; 调用缺省的构造函数调用缺省的构造函数 调用非缺省的构造函数调用非缺省的构造函数 退出主函数退出主函数 调用析构函数调用析构函数 调用析构函数调用析构函数 c构造函数与析构函数 在程序的执行过程中,对象如果用在程序的执行过程中,对象如果用 new运算符开辟了空间,则在类中应该定义运算符开辟了空间,则在类中应该定义 一个析构函数
20、,并在析构函数中使用一个析构函数,并在析构函数中使用delete 删除由删除由new分配的内存空间。因为在撤消对分配的内存空间。因为在撤消对 象时,系统自动收回为对象所分配的存储空象时,系统自动收回为对象所分配的存储空 间,而不能自动收回由间,而不能自动收回由new分配的动态存储分配的动态存储 空间。空间。 c构造函数与析构函数 class Str char *Sp; int Length; public: Str(char *string) if(string)Length=strlen(string); Sp=new charLength+1; strcpy(Sp,string); els
21、e Sp=0; void Show(void) coutSpendl; Str() if(Sp)delete Sp; ; void main(void) Str s1(Study C+); s1.Show(); 在构造函数中将成在构造函数中将成 员数据指针指向动员数据指针指向动 态开辟的内存态开辟的内存 用初值为开辟用初值为开辟 的内存赋值的内存赋值 析构函数,当释析构函数,当释 放对象时收回用放对象时收回用 new开辟的空间开辟的空间 c构造函数与析构函数 Study C+ 0 string Length=strlen(string); Sp=new charLength+1; Sp new
22、开辟的空间开辟的空间 strcpy(Sp,string); Study C+ 0 c构造函数与析构函数 用用new运算符为对象分配动态存储空间时,调运算符为对象分配动态存储空间时,调 用了构造函数,用用了构造函数,用delete删除这个空间时,调用了删除这个空间时,调用了 析构函数。当使用运算符析构函数。当使用运算符delete删除一个由删除一个由new动动 态产生的对象时,它首先调用该对象的析构函数,态产生的对象时,它首先调用该对象的析构函数, 然后再释放这个对象占用的内存空间。然后再释放这个对象占用的内存空间。 可以用可以用new运算符为对象分配存储空间,如:运算符为对象分配存储空间,如:
23、 A *p; p=new A; 这时必须用这时必须用delete才能释放这一空间。才能释放这一空间。 delete p; c构造函数与析构函数 class A float x,y; public: A(float a, float b)x=a;y=b;cout调用了构造函数调用了构造函数n; void Print(void) coutxtyendl; A() cout调用了析构函数调用了析构函数n; ; void main(void) coutPrint(); delete pa1; /调用析构函数调用析构函数 cout退出退出main()函数函数n; 进入进入main()函数函数 调用了构造
24、函数调用了构造函数 35 调用了析构函数调用了析构函数 退出退出main()函数函数 c构造函数与析构函数 不同存储类型的对象调用构造函数及析构函数不同存储类型的对象调用构造函数及析构函数 1、对于全局定义的对象(在函数外定义的对象),、对于全局定义的对象(在函数外定义的对象), 在程序开始执行时,调用构造函数;到程序结束在程序开始执行时,调用构造函数;到程序结束 时,调用析构函数。时,调用析构函数。 2、对于局部定义的对象(在函数内定义的对象),、对于局部定义的对象(在函数内定义的对象), 当程序执行到定义对象的地方时,调用构造函数;当程序执行到定义对象的地方时,调用构造函数; 在退出对象的
25、作用域时,调用析构函数。在退出对象的作用域时,调用析构函数。 3、用、用static定义的局部对象,在首次到达对象的定定义的局部对象,在首次到达对象的定 义时调用构造函数;到程序结束时,调用析构函数义时调用构造函数;到程序结束时,调用析构函数 c构造函数与析构函数 4、对于用、对于用new运算符动态生成的对象,在产生对运算符动态生成的对象,在产生对 象时调用构造函数,只有使用象时调用构造函数,只有使用delete运算符来释放运算符来释放 对象时,才调用析构函数。若不使用对象时,才调用析构函数。若不使用delete来撤消来撤消 动态生成的对象,程序结束时,对象仍存在,并动态生成的对象,程序结束时
26、,对象仍存在,并 占用相应的存储空间,即系统不能自动地调用析占用相应的存储空间,即系统不能自动地调用析 构函数来撤消动态生成的对象。构函数来撤消动态生成的对象。 c构造函数与析构函数 class A float x,y; public: A(float a, float b)x=a;y=b;cout初始化自动局部对象初始化自动局部对象n; A() x=0; y=0; cout初始化静态局部对象初始化静态局部对象n; A(float a) x=a; y=0; cout初始化全局对象初始化全局对象n; A() cout“调用析构函数调用析构函数”endl; ; A a0(100.0);/定义全局对
27、象定义全局对象 void f(void) cout 进入进入f()函数函数n; A ab(10.0, 20.0);/定义局部自动对象定义局部自动对象 static A a3; /初始化局部静态对象初始化局部静态对象 void main(void) cout进入进入main函数函数n; f(); f(); 初始化全局对象初始化全局对象 进入进入main函数函数 初始化自动局部对象初始化自动局部对象 进入进入f()函数函数 初始化静态局部对象初始化静态局部对象 进入进入f()函数函数 初始化自动局部对象初始化自动局部对象 调用析构函数调用析构函数 调用析构函数调用析构函数 调用析构函数调用析构函数
28、 调用析构函数调用析构函数 c构造函数与析构函数 举例:建立一个类举例:建立一个类NUM,求指定数据范围内的所有素数。,求指定数据范围内的所有素数。 如:如: 定义类定义类NUM的对象的对象test,查找范围为,查找范围为100200,正,正 确的输出结果:确的输出结果: num=21 101 103 107 109 113 127 131 c构造函数与析构函数 动态构造及析构对象数组动态构造及析构对象数组 用用new运算符来动态生成对象数组时,自动调用构运算符来动态生成对象数组时,自动调用构 造函数,而用造函数,而用delete运算符来释放运算符来释放p1所指向的对象所指向的对象 数组占用的
29、存储空间时,在指针变量的前面必须数组占用的存储空间时,在指针变量的前面必须 加上加上 , 才能将数组元素所占用的空间全部释放。才能将数组元素所占用的空间全部释放。 否则,只释放第否则,只释放第0个元素所占用的空间。个元素所占用的空间。 pa1=new A3; . delete pa1; c构造函数与析构函数 class A float x,y; public: A(float a=0, float b=0)x=a; y=b;cout调用了构造函数调用了构造函数n; void Print(void) coutxtyendl; A() cout调用了析构函数调用了析构函数n; ; void mai
30、n(void) cout进入进入main()函数函数n; A *pa1; pa1=new A3;/开辟数组空间开辟数组空间 coutn完成开辟数组空间完成开辟数组空间nn; delete pa1; /必须用必须用删除开辟的空间删除开辟的空间 cout退出退出main()函数函数n; 进入进入main()函数函数 调用了构造函数调用了构造函数 调用了构造函数调用了构造函数 调用了构造函数调用了构造函数 完成开辟数组空间完成开辟数组空间 调用了析构函数调用了析构函数 调用了析构函数调用了析构函数 调用了析构函数调用了析构函数 退出退出main()函数函数 c构造函数与析构函数 缺省的析构函数 若在
31、类的定义中没有显式地定义析构函数时,则若在类的定义中没有显式地定义析构函数时,则 编译器自动地产生一个缺省的析构函数,其格式编译器自动地产生一个缺省的析构函数,其格式 为:为: ClassName:ClassName() ; 任何对象都必须有构造函数和析构函数,但在撤任何对象都必须有构造函数和析构函数,但在撤 消对象时,要释放对象的数据成员用消对象时,要释放对象的数据成员用new运算符分运算符分 配的动态空间时,必须显式地定义析构函数。配的动态空间时,必须显式地定义析构函数。 c构造函数与析构函数 实现类型转换的构造函数实现类型转换的构造函数 同类型的对象可以相互赋值,相当于类中的数据同类型的
32、对象可以相互赋值,相当于类中的数据 成员相互赋值;成员相互赋值; 如果直接将数据赋给对象,所赋入的数据需要强如果直接将数据赋给对象,所赋入的数据需要强 制类型转换,这种转换需要调用构造函数。制类型转换,这种转换需要调用构造函数。 c构造函数与析构函数 class A float x,y; public: A(float a,float b) x=a;y=b;cout调用构造函数调用构造函数n; A() cout调用析构函数调用析构函数n; void Print(void) coutxtyendl; ; void main(void) A a1(1.0, 10.0); a1.Print(); a
33、1=A(3.0 , 30.0); a1.Print(); cout退出主函数退出主函数n; 调用构造函数调用构造函数 产生临时对象,产生临时对象, 初始化并赋值后初始化并赋值后 立即释放立即释放 1 10 调用构造函数调用构造函数 调用析构函数调用析构函数 330 退出主函数退出主函数 调用析构函数调用析构函数 c构造函数与析构函数 注意:当构造函数只有一个参数时,可以用注意:当构造函数只有一个参数时,可以用= 强制赋值。强制赋值。 class B float x; public: B(float a) x=a; cout调用构造函数调用构造函数n; B() cout调用析构函数调用析构函数n
34、; void Print(void) coutxendl; ; void main(void) B b1(1.0) ;b1.Print(); B b2=100; b2.Print(); b1=10; b1.Print(); cout退出主函数退出主函数n; 调用构造函数调用构造函数 单参数可以这样赋值单参数可以这样赋值 1 调用构造函数调用构造函数 100 调用构造函数调用构造函数 调用析构函数调用析构函数 10 退出主函数退出主函数 调用析构函数调用析构函数 调用析构函数调用析构函数 b1=B(10) 产生一个产生一个 临时对象临时对象 c构造函数与析构函数 完成拷贝功能的构造函数完成拷贝功
35、能的构造函数 可以在定义一个对象的时候用另一个对象为其初可以在定义一个对象的时候用另一个对象为其初 始化,即构造函数的参数是另一个对象的引用,始化,即构造函数的参数是另一个对象的引用, 这种构造函数常为完成拷贝功能的构造函数。这种构造函数常为完成拷贝功能的构造函数。 完成拷贝功能的构造函数的一般格式为:完成拷贝功能的构造函数的一般格式为: ClassName:ClassName(ClassName public: A(float a=0, float b=0)x=a; y=b; A(A y=a.y; ; void main(void) A a1(1.0,2.0); A a2(a1); 形参必须
36、是同类型对象的引用形参必须是同类型对象的引用 实参是同类型的对象实参是同类型的对象 c构造函数与析构函数 class A float x,y; public: A(float a=0, float b=0)x=a; y=b;cout调用了构造函数调用了构造函数n; A(A y=a.y;cout“调用了完成拷贝功能的构造函数调用了完成拷贝功能的构造函数n”; void Print(void) coutxtyendl; A() cout调用了析构函数调用了析构函数n; ; void main(void) A a1(1.0,2.0); A a2(a1); a1.Print(); a2.Print()
37、; 调用了构造函数调用了构造函数 调用了完成拷贝功能的构造函数调用了完成拷贝功能的构造函数 12 12 调用了析构函数调用了析构函数 调用了析构函数调用了析构函数 用已有的对象中的数据为新创建的对象赋值用已有的对象中的数据为新创建的对象赋值 c构造函数与析构函数 如果没有定义完成拷贝功能的构造函数,编如果没有定义完成拷贝功能的构造函数,编 译器自动生成一个隐含的完成拷贝功能的构译器自动生成一个隐含的完成拷贝功能的构 造函数造函数,依次完成类中对应数据成员的拷贝依次完成类中对应数据成员的拷贝。 A:A(A y=a.y; 隐含的构隐含的构 造函数造函数 c构造函数与析构函数 class A flo
38、at x,y; public: A(float a=0, float b=0)x=a; y=b;cout调用了构造函数调用了构造函数n; void Print(void) coutxtyendl; A() cout调用了析构函数调用了析构函数n; ; void main(void) A a1(1.0,2.0); A a2(a1); A a3=a1;/可以这样赋值可以这样赋值 a1.Print(); a2.Print(); a3.Print(); 调用了构造函数调用了构造函数 12 12 12 调用了析构函数调用了析构函数 调用了析构函数调用了析构函数 调用了析构函数调用了析构函数 隐含了拷贝隐
39、含了拷贝 的构造函数的构造函数 c构造函数与析构函数 由编译器为每个类产生的这种隐含的完成拷由编译器为每个类产生的这种隐含的完成拷 贝功能的构造函数,依次完成类中对应数据贝功能的构造函数,依次完成类中对应数据 成员的拷贝。成员的拷贝。 但是,当类中的数据成员中使用但是,当类中的数据成员中使用new运算符,运算符, 动态地申请存储空间进行赋初值时,必须在动态地申请存储空间进行赋初值时,必须在 类中显式地定义一个完成拷贝功能的构造函类中显式地定义一个完成拷贝功能的构造函 数,以便正确实现数据成员的复制数,以便正确实现数据成员的复制。 c构造函数与析构函数 class Str int Length;
40、 char *Sp; public: Str(char *string) if(string)Length=strlen(string); Sp=new charLength+1; strcpy(Sp,string); else Sp=0; void Show(void)coutSpendl; Str()if(Sp) delete Sp; ; void main(void) Str s1(Study C+); Str s2(s1); s1.Show ();s2.Show (); 隐含的拷贝构造函数为:隐含的拷贝构造函数为: Str:Str(Str Sp=s.Sp; “Study C+” s1.
41、Sp s2.Sp new开辟开辟 的空间的空间 同一空间释放两次,造成运同一空间释放两次,造成运 行错误。行错误。 c构造函数与析构函数 在这种情况下,必须要定义完成拷贝功能的构造函数。在这种情况下,必须要定义完成拷贝功能的构造函数。 Str:Str(Str Sp=new charLength+1; strcpy(Sp,s.Sp); else Sp=0; Str s2(s1); “Study C+” s1.Sp 原来原来s1开开 辟的空间辟的空间 “Study C+” s2.Sp 拷贝函数中用拷贝函数中用 new开辟的空间开辟的空间 c构造函数与析构函数 构造函数与对象成员构造函数与对象成员 对类对类A的对象初始化的同时还要对其成员数的对象初始化的同时还要对其成员数 据类据类B的对象进行初始化,所以,类的对象进行初始化,所以,类A的构造的构造 函数中要调用类函数中要调用类B的构造函数。的构
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 北京知识直播培训课件
- 2025年党章知识竞赛必考题及答案
- (2025年)黑龙江省牡丹江市全国计算机等级考试网络技术预测试题含答案
- 循环系统护理试题(含答案)
- 护理查对制度试题及标准答案
- 2024年急性精神科科N2-N4护士理论知识考核试题(含答案)
- 2024年山东“安全生产月”知识主题试题附参考答案
- 2024年全国RDPAC资格认证考试题库(附含答案)
- 2025年育婴师三级(高级育婴师)从业资格证考试内容及答案
- 标准基础知识培训课件教学
- 医院信息系统廉洁风险防控方案
- 2025年《农产品质量安全法》知识点考试题库资料及答案
- 智人扩散路径重构-洞察及研究
- 三方委托付工程款协议书
- 信通员考试试题及答案
- 四川成都成华区龙潭街道办事处招聘编外聘用制工作人员笔试模拟试题及答案详解1套
- 有限空间安全作业培训试题(含答案)
- 物业应急管理办法
- 设备调剂管理办法
- 蓝天救援队规定管理制度
- 银监会手机租赁管理办法
评论
0/150
提交评论