拷贝构造函数:
1.定义:只有单个形参,而且该形参必须是本类对象的const引用(请思考为什么?),它是特殊的构造函数创建对象时使用已经存在的同类对象来进行初始化,由编译器自动调用。2.特征:1)它是构造函数的重载2)如果没有显式定义,系统会自动合成一个默认的拷贝构造函数,默认的构造函数会将其参数的成员逐个拷贝到正在创建的对象中。3)用途:a.对象实例化对象例如:data d1(2016,2,14);data d2(d1);b.将一个对象作为实参传递非引用类型的形参例如:void fun(const data d2){}c.从一个返回类型为非引用类型的函数返回一个对象data fun1(){ data d3; return d3;}解答:为什么拷贝构造函数形参必须是本类对象的const引用?若定义为:Data(const Data d)因为参数的传递本身就是复制,而复制一个临时的Data对象的时候要调用拷贝构造函数。(也就是自己,调用自己的时候又是一次参数传递,所以又要调用一次自己(即:调构造函数)),这样会一直恶性循环下去,造成无休止递归调用。4.阻止拷贝:在新标准下,我们可以将拷贝构造函数和拷贝赋值运算符定义为删除的函数(delete)来阻止拷贝,虽然我们声明了删除的函数,但是不能以任何方式使用它们,格式为:在参数列表后面加上“=delete”来指出我们希望将它定义为删除的。例如:Data(const Data&d) = delete;//阻止拷贝data &Operator=(const data&)=delete//阻止赋值注意:=delete必须出现在第一次声明的地方,我们可以对任何函数指定=delete,虽然删除函数主要作用是禁止拷贝控制成员,但当我们希望引导函数匹配过程时,删除函数有时也是有用的。析构函数:1.定义:是类的一个成员函数,与构造函数功能相反,在对象被销毁时,编译器自动调用,释放对象使用的资源(不是删除对象),并销毁对象的非static数据成员(static局部对象在函数调用结束时对象并不释放,因此也不用调用析构函数,只有在main函数结束或调用exit函数结束程序时候,才调用static局部对象的析构函数)。2.先构造的后析构,后构造的先析构(他相当于一个栈,先进后出)。3.析构函数没有返回值,没有函数类型,也没有函数参数。因此,它不能被重载,一个类可以有多个构造函数,但只有一个析构函数。*/新闻热点
疑难解答
图片精选