c语言中default的用法_第1页
c语言中default的用法_第2页
c语言中default的用法_第3页
免费预览已结束,剩余1页可下载查看

下载本文档

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

文档简介

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

2、然还是可手动生成默认版本的。 当我们自己定义了待参数的构造函数时,我们最好是声明不带参 数的版本以完成无参的变量初始化,此时编译是不会再自动提供默认 的无参版本了。我们可以通过使用关键字 default 来控制默认构造函数的生成,显式地指示编译器生成该函数的默认版本。比方: classMyClasspublic:MyClass()=default; /同/ 时提供默认版本和 带参版本,类型是 POD的 MyClass(inti):data(i)private:int data;有些时 候我们希望限制默认函数的生成。典型的是禁止使用拷贝构造函数,以往的做法是将拷贝构造函数声明为private的并

3、不提供实现,这样当拷贝构造对象时编译不能通过,C+11那么使用delete关键字显式指示编译器不生成函数的默认版本。比方:二、 default 和 delete 的其他用途上面我们已经看到在类中我们可 用 default 和 delete 修饰成员函数,使之成为缺省函数或者删除函数, 在 类的外面 , default 可 以在类定 义之 外修饰成 员函数 ,比方 : classMyClasspublic:MyClass()=default;MyClass() &operator=(constMyClass& ););/ 在类的定义外用 default 来指明缺省函 数版本 in

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

5、类型的对象了。对于一个删除了析构函数的类型,编译器将不允许定义该类型的 变量或创立该类型的临时对象,而且如果一个类有某个成员的类型删 除了析构函数,也不能定义该类的变量或临时对象,因为一个成员的 析构函数是删除的,那么该成员无法销毁,包含它的类也就没法销毁。虽然对于删除了析构函数的类型,我们不能定义这种类型的变量 或成员但可以动态分配这种类型的对象,比方:关于 delete 的显式删除, 并非局限于成员函数, 比方:voidFunc(inti);void Func(char c)=delete; / 显式删除 char 版本 intmain()Func(3);Func('c无法编译通过

6、 return 0;这里因为 Func的 char版本已经被删除,故Func('c')会编译失败。由此我们也知 default 是只局限作用于类的局部成员函数的。 于是我们还可用 delete 来防止不必要的隐式数据类型转换。 比方: classMyClasspublic:MyClass(inti);MyClsss(chacr)=delete; / 删 除 char 版 本 的 构 造 函 数 ; void Fun(MyClass m)int main()Func(3);Func('a'); / 编译不能通过 MyClassm1(3);MyClassm2(

7、9;a'); /编译不能通过这是因为char版本的构造函数被删除后,试图从 char 构造MyClass对象的方式是不允许的了。但去掉这句的函数删除后,编译器会隐式的将 a 转换为整型使得 编译通过,调用的是整型构造函数,这可能并不是你所想要的。但 是 如 果 这 样 : classMyClasspublic:MyClass(inti);explicit MyClsss(char c)=delete; /删除 explicit 的 char 版本的构造函数于是我们不提倡 explicit 和 delete 混用。对与普通函数 delete 也有类型的效果。delete的用法还包括删除operator new操作符,编码在堆上分配该 类的对象如:void* operator new(std:size_t)二delete;合成的拷贝控制成 员可能是删除的,如果一个类有数据成员不能默认构造、拷贝、复制 或销毁,那么对应的成员函数将被定义为删除的。因此:如果类的某个成员的析构函数是删除的或不可访问的,那 么类的合成析构函数被定义为删除的。如果类的某个成员的拷贝构造函数是删除的或不可访问的,那么类 的合成拷贝构造函数也被定义为删除的。如果类的某个成员的拷贝赋值运算符是删除的或不可访问的,或 是类有一个 const 的或引用成员, 那么类的

温馨提示

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

评论

0/150

提交评论