欢迎来到天天文库
浏览记录
ID:38719000
大小:49.50 KB
页数:8页
时间:2019-06-18
《类的构造函数、析构函数、复制构造函数和赋值操作符》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、类的构造函数、析构函数、复制构造函数和赋值操作符作者:lyb661时间:20140318首先,回顾一下有关函数的知识。函数声明一般由三个部分组成:返回类型、函数名和由圆括号括起来的参数表。(1)函数可以没有返回类型,这时返回类型由void表示;(2)函数名标志函数的接口,也是与其他函数区别的标志;(3)函数可以没有参数,也可以有一至多个参数;(4)可以根据参数类型、数量的差别重载函数。例如:intsum(inta,intb);voidwrite(charc);voiddisplay()const;重载函数的例子:voidswap(intx,inty);
2、voidswap(doublex,doubley);上面是一些带有内置类型参数的函数的例子。类类型同样有与自己相关的函数。其中有几个特殊的成员函数,对类来说至为重要。1、类的构造函数(consructor):构造函数用于创建类对象时完成必要的初始化工作。所有的类都需要构造函数。它没有返回类型,函数与类同名,可以没有,也可以有多个参数,如果必要。////////////////////////////////////【例1】Data_class1#includeusingstd::cout;usingstd::endl;classDa
3、ta{intvalue;public:Data(intinitial=0):value(initial){}//构造函数constructorintread()const{returnvalue;}voidwrite(inti){value=i;}};intmain(){Dataa(10);8cout<4、/////////////关于构造函数有以下几点:(1)对于任何类,编译器会自动调用一个默认的构造函数;(2)如果定义了自己的构造函数,则默认的构造函数将不再工作;(3)同一般的函数一样,构造函数也可以被重载。(4)可以定义默构造函数,如编译器合成的那样工作。Data(intinitial=0):value(initial){}就是一个重载的有默认值的构造函数。当创建对象a(10)时只有调用它才能正常工作。注意到该构造函数的参数有个默认值"0"。如果没胡这个0,则对象b就不能被建立。它代替默认构造函数的部分工作。对于这个简单的Data类,它的默认构造函5、数应该是这样:Data(){}。这个由编译器合成的构造函数用于创建一个对象而不显式地初始化。如果用这个默认构造函数替换我们自己定义的构造函数,则a对象的建立是无效的,而对象b的成员初始值是无定义的,有兴趣的话可以自己试一试。当然,也可以用成员函数read()来完成一些初始化工作。总之,像这样一个简单的类,默认构造函数的工作也不是尽如人意的。对于复杂一点的类呢?////////////////////////////////////【例2】Data_class2(警告:本程序有内存泄漏风险不要上机运行)#includeusingstd6、::cout;usingstd::endl;classData{int*ip;public:Data(int&i):ip(newint(i)){}8~Data(){deleteip;}//destructorintread()const{return*ip;}voidwrite(intn){*ip=n;}};intmain(){intobj=10;Dataa(obj);cout<7、//本例是上一例的改进,由于类具有指针成员,并且申请自由存储,所以重新定义了析构函数的行为,用于删除指针。2、类的析构函数(destructor):析构函数与类同名,在名字前加符号~以与构造函数相区别。析构函数用于在类对象超出作用域时按类中声明次序的逆序撤销各个成员。与构造函数有所不同:尽管类定义了自己的析构函数,编译器合成的析构函数也会正常工作。由于函数重载规则的限制,析构函数是不能被重载的。为什么?我们所谓自定义的意思,不过在它常规工作量外给它加了点的担子。对于上面的Data类来说,它的默认的析构函数~Data(){}的工作并不能令人满意。该类有一8、个int类型的指针成员,在程序运行过程中由该指针申请了自由存储,所以必须定义一个析构函数,在程
4、/////////////关于构造函数有以下几点:(1)对于任何类,编译器会自动调用一个默认的构造函数;(2)如果定义了自己的构造函数,则默认的构造函数将不再工作;(3)同一般的函数一样,构造函数也可以被重载。(4)可以定义默构造函数,如编译器合成的那样工作。Data(intinitial=0):value(initial){}就是一个重载的有默认值的构造函数。当创建对象a(10)时只有调用它才能正常工作。注意到该构造函数的参数有个默认值"0"。如果没胡这个0,则对象b就不能被建立。它代替默认构造函数的部分工作。对于这个简单的Data类,它的默认构造函
5、数应该是这样:Data(){}。这个由编译器合成的构造函数用于创建一个对象而不显式地初始化。如果用这个默认构造函数替换我们自己定义的构造函数,则a对象的建立是无效的,而对象b的成员初始值是无定义的,有兴趣的话可以自己试一试。当然,也可以用成员函数read()来完成一些初始化工作。总之,像这样一个简单的类,默认构造函数的工作也不是尽如人意的。对于复杂一点的类呢?////////////////////////////////////【例2】Data_class2(警告:本程序有内存泄漏风险不要上机运行)#includeusingstd
6、::cout;usingstd::endl;classData{int*ip;public:Data(int&i):ip(newint(i)){}8~Data(){deleteip;}//destructorintread()const{return*ip;}voidwrite(intn){*ip=n;}};intmain(){intobj=10;Dataa(obj);cout<7、//本例是上一例的改进,由于类具有指针成员,并且申请自由存储,所以重新定义了析构函数的行为,用于删除指针。2、类的析构函数(destructor):析构函数与类同名,在名字前加符号~以与构造函数相区别。析构函数用于在类对象超出作用域时按类中声明次序的逆序撤销各个成员。与构造函数有所不同:尽管类定义了自己的析构函数,编译器合成的析构函数也会正常工作。由于函数重载规则的限制,析构函数是不能被重载的。为什么?我们所谓自定义的意思,不过在它常规工作量外给它加了点的担子。对于上面的Data类来说,它的默认的析构函数~Data(){}的工作并不能令人满意。该类有一8、个int类型的指针成员,在程序运行过程中由该指针申请了自由存储,所以必须定义一个析构函数,在程
7、//本例是上一例的改进,由于类具有指针成员,并且申请自由存储,所以重新定义了析构函数的行为,用于删除指针。2、类的析构函数(destructor):析构函数与类同名,在名字前加符号~以与构造函数相区别。析构函数用于在类对象超出作用域时按类中声明次序的逆序撤销各个成员。与构造函数有所不同:尽管类定义了自己的析构函数,编译器合成的析构函数也会正常工作。由于函数重载规则的限制,析构函数是不能被重载的。为什么?我们所谓自定义的意思,不过在它常规工作量外给它加了点的担子。对于上面的Data类来说,它的默认的析构函数~Data(){}的工作并不能令人满意。该类有一
8、个int类型的指针成员,在程序运行过程中由该指针申请了自由存储,所以必须定义一个析构函数,在程
此文档下载收益归作者所有