位置:首页 > 其它资料

c语言中default的用法

2020-02-04发布者:郝悦皓大小:90.06 KB 下载:0

C 语言中的 switch 和 default 的意思 1.用于多分支选择的 switch 语句, 其一般形式为: switch(表达式) { case 常量表达式 1: 语句 1; case 常量表达式 2: 语句 2; … case 常量表达式 n: 语句 n; default: 语句 n+1;} 2.switch 是分支语句,就是比较强大的 if 集;default 为不满足所有的 switch 条件则后面的句子被执行。一般将 default 写在 switch 中的最后 3.是否要使用 deafult 不!但是为了进行错误检查或逻辑检查,还是应该在 switch 语句中加入 default 分支。例如,下述 switch 语句完全合法:switch (char_code){ case tyt: case 'y': printf ( " You answered YES ! n" ) break case 'N': case 'n': printf ("You answered NO!n"); break}但是,如果一个未知字符被传递给这 条 switch 语句,会出现什么情况呢?这时,程序将没有任何输出。因此,最 好 还 是 加 入 一 个 default 分 支 , 以 处 理 这 种 情 况 : ......default: printf ("Unknown response : %dn", char_code); break......此外,default 分支能给 逻辑检查带来很多方便。例如,如果用 switch 语句来处理数目固定的条件, 而且认为这些条件之外的值都属于逻辑错误,那么可以加入一个 default 分 支来辨识逻辑错误。 c 语言中 default 的用法:类中的默认函数 a.类中默认的成员函数 1.默认构造函数 2.默认析构函数 3.拷贝构造函数 4.拷贝赋值函数 5.移动构造函数 6.移动拷贝函数 b.类中自定义的操作符函数 1.operator 2.operator& 3.operator&& 4.operator* 5.operator-> 6.operator->* 7.operator new 8.operator delete 同时 C++规定,一旦程序员实现了这些函数的自定义版本,则编译器不 会再自动生产默认版本。注意只是不自动生成默认版本,当然还是可手动生 成默认版本的。当我们自己定义了待参数的构造函数时,我们最好是声明不 带参数的版本以完成无参的变量初始化,此时编译是不会再自动提供默认的 无参版本了。我们可以通过使用关键字 default 来控制默认构造函数的生成, 显式地指示编译器生成该函数的默认版本。比如: classMyClass { public: MyClass()=default; //同时提供默认版本和带参版本,类型是 POD 的 MyClass(inti):data(i){} private: int data; }; 有些时候我们希望限制默认函数的生成。典型的是禁止使用拷贝构造函 数,以往的做法是将拷贝构造函数声明为 private 的并不提供实现,这样当 拷贝构造对象时编译不能通过,C++11 则使用 delete 关键字显式指示编译器 不生成函数的默认版本。比如: classMyClass { public: MyClass()=default; MyClass(constMyClass& )=delete; ...... } 当然,一旦函数被 delete 过了,那么重载该函数也是非法的,该函数我 们习惯上称为删除函数。 c 语言中 default 和 delete 的其他用途 上面我们已经看到在类中我们可用 default 和 delete 修饰成员函数,使 之成为缺省函数或者删除函数,在类的外面,default 可以在类定义之外修 饰成员函数,比如: classMyClass { public: MyClass()=default; MyClass() &operator=(constMyClass& ); ); //在类的定义外用 default 来指明缺省函数版本 inlineMyClass&MyClass::operator=(constMyClass& )=default; 还可以 MyClass&MyClass::operator=(constMyClass& )=default;但是这 种类外定义合成的成员就不是内联函数。 与=default 不同,=delete 必须出现在函数的第一次声明中。因为一个 默认的成员只影响为这个成员生成的代码,因此=default 直到编译生成代码 时才需要,而编译器必须早早知道一个函数是否是删除的,以便禁止试图使 用它的操作。 一般情况下,析构函数不能定义为删除的,因为如果析构函数被删除, 就无法删除此类型的对象了。对于一个删除了析构函数的类型,编译器将不 允许定义该类型的变量或创建该类型的临时对象,而且如果一个类有某个成 员的类型删除了析构函数,也不能定义该类的变量或临时对象,因为一个成 员的析构函数是删除的,则该成员无法销毁,包含它的类也就没法销毁。虽 然对于删除了析构函数的类型,我们不能定义这种类型的变量或成员但可以 动态分配这种类型的对象,比如: StructNoDtor{ NoDtor()=default; ~NoDtor()=default; }; NoDtor *P=new NoDtor();//正确,但是我能 delete P 但是有时析构函数也是可以 delete 的,这样做的目的是我们在指定内存 位置进行内存分配时并不需要析构函数来完成对象级别的清理,这时我们可 显示删除析构函数来限制自定义类型在栈上或者静态的构造。 关于 delete 的显式删除,并非局限于成员函数,比如: voidFunc(inti){}; void Func(char c)=delete; //显式删除 char 版本 int main() { Func(3); Func('c’); //无法编译通过 return 0; } 这里因为 Func 的 char 版本已经被删除,故 Func('c')会编译失败。由此 我们也知 default 是只局限作用于类的部分成员函数的。于是我们还可用 delete 来避免不必要的隐式数据类型转换。比如: classMyClass { public: MyClass(inti){}; MyClsss(char c)=delete; //删除 char 版本的构造函数 }; void Fun(MyClass m){} int main() { Func(3); Func('a'); //编译不能通过 MyClassm1(3); MyClass m2('a'); //编译不能通过 } 这是因为 char 版本的构造函数被删除后,试图从 char 构造 MyClass 对 象的方式是不允许的了。但去掉这句的函数删除后,编译器会隐式的将 a 转 换为整型使得编译通过,调用的是整型构造函数,这可能并不是你所想要的。 但是如果这样: classMyClass { public: MyClass(inti){}; explicit MyClsss(char c)=delete; //删除 explicit 的 char 版本的构造函数 }; void Fun(MyClass m){} int main() { Func(3); Func('a'); //编译可通过 MyClassm1(3); MyClass m2('a'); //编译不能通过 } 将构造函数 explicit 后,构造函数一样的还是不能发生 char 的构造,因 为 char 构造版本被删除了,但在 Func 的调用中,编译器会尝试将 c 转换为 int,即 Func(a')会调用一次 MyClass(int )构造,顺利通过编译。于是我们 不提倡 explicit 和 delete 混用。对与普通函数 delete 也有类型的效果。 delete 的用法还包括删除 operator new 操作符,编码在堆上分配该类 的对象 如:void* operator new(std::size_t)=delete; 合成的拷贝控制成员可能是删除的,如果一个类有数据成员不能默认构 造、拷贝、复制或销毁,则对应的成员函数将被定义为删除的。因此: 如果类的某个成员的析构函数是删除的或不可访问的,那么类的合成析 构函数被定义为删除的。 如果类的某个成员的拷贝构造函数是删除的或不可访问的,则类的合成 拷贝构造函数也被定义为删除的。 如果类的某个成员的拷贝赋值运算符是删除的或不可访问的,或是类有 一个 const 的或引用成员,则类的合成拷贝赋值运算符被定义为删除的。 如果类的某个成员的析构函数是删除的或不可访问的,或是类有一个引 用成员,它没有类内初始化器,或是类有一个 const 成员,它没有类内初始 化器且其类型未显示定义默认构造函数,则该类的默认构造函数被定义为删 除的
温馨提示:当前文档最多只能预览 2 页,此文档共4 页,请下载原文档以浏览全部内容。如果当前文档预览出现乱码或未能正常浏览,请先下载原文档进行浏览。
发表评论(共0条评论)
请自觉遵守互联网相关政策法规,评论内容只代表网友观点,发表审核后显示!

下载需知:

1 该文档不包含其他附件(如表格、图纸),本站只保证下载后内容跟在线阅读一样,不确保内容完整性,请务必认真阅读

2 除PDF格式下载后需转换成word才能编辑,其他下载后均可以随意编辑修改

3 有的标题标有”最新”、多篇,实质内容并不相符,下载内容以在线阅读为准,请认真阅读全文再下载

4 该文档为会员上传,版权归上传者负责解释,如若侵犯你的隐私或权利,请联系客服投诉

返回顶部