- 一级建造师考试
- 二级建造师考试
- 三支一扶
- 安全评价师考试
- 保险经纪资格考试
- 报关员资格考试
- 博士入学考试
- 成人高考
- 成人英语三级考试
- 程序员考试
- 出版专业资格考试
- 大学英语三级
- 大学英语四六级考试
- 单证员考试
- 导游证考试
- 电气工程师
- 电子商务设计师考试
- 房地产经纪人考试
- 房地产评估师考试
- 高级会计师资格考试
- 高考
- 高中会考
- 给排水工程师
- 公共英语等级考试
- 公务员考试
- 国际货运代理
- 国际内审师
- 国家司法考试
- 化工师
- 环境影响评价师
- 会计人员继续教育
- 会计职称考试
- 基金从业资格
- 计算机等级考试
- 计算机软件水平考试
- 监理工程师考试
- 教师招聘
- 教师资格
- 结构工程师考试
- 经济师考试
- 考研
- 空姐招聘
- 遴选
- 美术高考
- 普通话考试
- 期货从业资格
- 求职招聘
- 人力资源管理师
- 软件设计师考试
- 商务英语考试(BEC)
- 社会工作者职业水平考试
- 审计师考试
- 事业单位招聘
- 事业单位招聘
- 数据库系统工程师
- 特许公认会计师(ACCA)
- 同等学力
- 统计师考试
- 托福考试(T0EFL)
- 外贸跟单员考试
- 网络工程师考试
- 网络管理员考试
- 网络规划设计师考试
- 系统分析师考试
- 消防工程师
- 小升初
- 校园招聘
- 信息系统管理工程师考试
- 选调生考试
- 雅思考试
- 岩土工程师考试
- 医生招聘
- 艺术高考(艺考)
- 银行从业人员资格
- 银行招聘
- 英语翻译资格考试
- 营销师考试
- 造假工程师考试
- 证券从业资格考试
- 中考
- 注册安全工程师考试
- 注册测绘师考试
- 注册城市规划师考试
- 注册环保工程师考试
- 注册会计师考试
- 注册计量师考试
- 注册建筑师考试
- 注册税务师考试
- 注册资产评估师
- 专升本考试
- 专业英语四级八级考试
- 自考
- 安全员
- 跟单员
- 考试一本通
- 其它资料
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 该文档为会员上传,版权归上传者负责解释,如若侵犯你的隐私或权利,请联系客服投诉
点击加载更多评论>>