C的默认函数与default和delete用法.docx

C的默认函数与default和delete用法.docx

ID:62037244

大小:20.50 KB

页数:4页

时间:2021-04-15

C的默认函数与default和delete用法.docx_第1页
C的默认函数与default和delete用法.docx_第2页
C的默认函数与default和delete用法.docx_第3页
C的默认函数与default和delete用法.docx_第4页
资源描述:

《C的默认函数与default和delete用法.docx》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、C++中的默认函数与default和delete用法一、类中的默认函数a.类中默认的成员函数1.默认构造函数2.默认析构函数3.拷贝构造函数4.拷贝赋值函数5.移动构造函数6.移动拷贝函数b.类中自定义的操作符函数1.operator2.operator&3.operator&&4.operator*5.operator->6.operator->*7.operatornew8.operatordelete同时C++规定,一旦程序员实现了这些函数的自定义版本,则编译器不会再自动生产默认版本。注意只

2、是不自动生成默认版本,当然还是可手动生成默认版本的。当我们自己定义了待参数的构造函数时,我们最好是声明不带参数的版本以完成无参的变量初始化,此时编译是不会再自动提供默认的无参版本了。我们可以通过使用关键字default来控制默认构造函数的生成,显式地指示编译器生成该函数的默认版本。比如:classMyClass{public:MyClass()=default;//同时提供默认版本和带参版本,类型是POD的MyClass(inti):data(i){}private:intdata;};有些时候我

3、们希望限制默认函数的生成。典型的是禁止使用拷贝构造函数,以往的做法是将拷贝构造函数声明为private的并不提供实现,这样当拷贝构造对象时编译不能通过,C++11则使用delete关键字显式指示编译器不生成函数的默认版本。比如:classMyClass{public:MyClass()=default;MyClass(constMyClass&)=delete;......}当然,一旦函数被delete过了,那么重载该函数也是非法的,该函数我们习惯上称为删除函数。二、default和delete的

4、其他用途上面我们已经看到在类中我们可用default和delete修饰成员函数,使之成为缺省函数或者删除函数,在类的外面,default可以在类定义之外修饰成员函数,比如:classMyClass{public:MyClass()=default;MyClass()&operator=(constMyClass&););//在类的定义外用default来指明缺省函数版本inlineMyClass&MyClass::operator=(constMyClass&)=default;还可以MyClas

5、s&MyClass::operator=(constMyClass&)=default;但是这种类外定义合成的成员就不是内联函数。与=default不同,=delete必须出现在函数的第一次声明中。因为一个默认的成员只影响为这个成员生成的代码,因此=default直到编译生成代码时才需要,而编译器必须早早知道一个函数是否是删除的,以便禁止试图使用它的操作。一般情况下,析构函数不能定义为删除的,因为如果析构函数被删除,就无法删除此类型的对象了。对于一个删除了析构函数的类型,编译器将不允许定义该类型的

6、变量或创建该类型的临时对象,而且如果一个类有某个成员的类型删除了析构函数,也不能定义该类的变量或临时对象,因为一个成员的析构函数是删除的,则该成员无法销毁,包含它的类也就没法销毁。虽然对于删除了析构函数的类型,我们不能定义这种类型的变量或成员但可以动态分配这种类型的对象,比如:StructNoDtor{NoDtor()=default;~NoDtor()=default;};NoDtor*P=newNoDtor();//正确,但是我能deleteP但是有时析构函数也是可以delete的,这样做的目

7、的是我们在指定内存位置进行内存分配时并不需要析构函数来完成对象级别的清理,这时我们可显示删除析构函数来限制自定义类型在栈上或者静态的构造。关于delete的显式删除,并非局限于成员函数,比如:voidFunc(inti){};voidFunc(charc)=delete;//显式删除char版本intmain(){Func(3);Func('c’);//无法编译通过return0;}这里因为Func的char版本已经被删除,故Func('c')会编译失败。由此我们也知default是只局限作用于类

8、的部分成员函数的。于是我们还可用delete来避免不必要的隐式数据类型转换。比如:classMyClass{public:MyClass(inti){};MyClsss(charc)=delete;//删除char版本的构造函数};voidFun(MyClassm){}intmain(){Func(3);Func('a');//编译不能通过MyClassm1(3);MyClassm2('a');//编译不能通过}这是因为char版本的构造函数被删除后,试图从char构造MyClas

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。