C++程序设计方法3:禁止自动类型转换
禁止自动类型转换 explicit
#include <iostream>
using namespace std; class Src;//前置类型声明,因为在Dst中要用到Src的类
class Dst
{
public:
Dst()
{
cout << "Dst::Dst()" << endl;
}
explicit //<1>不准用于自动类型转换
Dst(const Src& s)
{
cout << "Dst::Dst(const Src&)" << endl;
}
}; class Src
{
public:
Src()
{
cout << "Src::Src()" << endl;
}
explicit//<2>不准用于自动类型转换
operator Dst() const
{
cout << "Src::operator Dst() called" << endl;
return Dst();
}
}; void Func(Dst d)
{ } int main()
{
Src s;
Dst d1(s);//注意这是直接构造不能视为类型转换
//以下语句都使用了自动类型转化,当构造函数,类型转换函数,
//均使用了explicit声明时,他们就不能用于自动类型转化了
//所以下面的语句都不能编译通过
Dst d2 = s;//error!not 自动类型转化
Func(s);//errror! not 自动类型转化
//解决问题的办法:<1>和<2>c处的explicit
//不能都不要(去掉),但也不能都要(保留)
return ;
}
禁止自动类型转换--delete
使用=delete修饰的成员函数,不允许被调用
class T
{
public:
T(int)
{
//若没有下面这条语句,则main函数中所有的语句均可以编译通过
T(char) = delete;//可以消除自动转换带来的隐患
}
}; void Fun(T t)
{
} int main()
{
Fun();
//Fun('x');自动类型转换失败(char->int),编译不通过
T ci();
//T cc('x');自动类型转换失败,编译不通过
return ;
}
//可以使用=delete删除普通函数(非成员函数)
//可以消除一些自动类型转换带来的隐患 void Fun(int i)
{
} void Fun(char c) = delete;//显示删除char版本
int main()
{
Fun();
//Fun('A');//编译不通过!
return ;
}
C++程序设计方法3:禁止自动类型转换的更多相关文章
- C++程序设计方法3:自动类型转换
方法1:在源类中定义目标类型转换运算符 #include <iostream> using namespace std; class Dst { public: Dst() { cout ...
- C++程序设计方法3:强制类型转换
强制类型转换(显示转换) dynamic_cast<Dst_Type>(Src_var) Src_var必须是引用或者指针类型,Dst_Type类中含有虚函数,否则会有编译错误: 若目标类 ...
- JavaScript中判断变量类型最简洁的实现方法以及自动类型转换(#################################)
这篇文章主要介绍了JavaScript中判断整字类型最简洁的实现方法,本文给出多个判断整数的方法,最后总结出一个最短.最简洁的实现方法,需要的朋友可以参考下 我们知道JavaScript提供了type ...
- win10禁止自动更新的终极方法(亲测有效)
想必用过win10的朋友对其自动更新一定不会陌生,并且深恶痛绝, 有时正专注做一件事,突然就开始自动更新,被杀个措手不及,而且更新时间真的太久了,尤其最近更新频繁,真是伤脑筋, 期间也尝试 ...
- JavaScript系列文章:自动类型转换-续
在上一篇文章中,我们详细讲解了JavaScript中的自动类型转换,由于篇幅限制,没能覆盖到所有的转换规则,这次准备详细讲解一下. 上次我们提到了对象类型参与运算时转换规则: 1). 在逻辑环境中执行 ...
- JavaScript系列文章:自动类型转换
我们都知道,JavaScript是类型松散型语言,在声明一个变量时,我们是无法明确声明其类型的,变量的类型是根据其实际值来决定的,而且在运行期间,我们可以随时改变这个变量的值和类型,另外,变量在运行期 ...
- struts基于ognl的自动类型转换需要注意的地方
好吧,坎坷的过程我就不说了,直接上结论: 在struts2中使用基于ognl的自动类型转换时,Action中的对象属性必须同时添加get/set方法. 例如: 客户端表单: <s:form ac ...
- 【转】JavaScript系列文章:自动类型转换
我们都知道,JavaScript是类型松散型语言,在声明一个变量时,我们是无法明确声明其类型的,变量的类型是根据其实际值来决定的,而且在运行期间,我们可以随时改变这个变量的值和类型,另外,变量在运行期 ...
- mooc- 基本程序设计方法week1,week2
学习了第一单元我们几本可以写出10行左右的代码. week1:python编程之基本方法 1.从计算机到程序设计语言: 理解计算机:计算机是能够根据一组指令操作数据的机器. 功能性:可以进行数据计算 ...
随机推荐
- lsattr chattr 文件安全设置
[root@test_android_client_download xianlaigames]# lsattr -------------e- ./jilinmj.apk[root@test_and ...
- 天财商龙SQL查询ID登陆POS情况
SELECT * FROM [tcgem_client0001].[dbo].[TCB_POS] ' --查询ID登陆POS情况
- redis性能监控(一): Redis Info 命令 - 获取 Redis 服务器的各种信息和统计数值
https://blog.csdn.net/wmx3ng/article/details/82772891 https://blog.csdn.net/lxpbs8851/article/detail ...
- 基于Redis的分布式锁到底安全吗
http://zhangtielei.com/posts/blog-redlock-reasoning.html
- Quartz.net入门
简介 Quartz.NET是一个开源的作业调度框架,是OpenSymphony的 Quartz API的.NET移植,它用C#写成,可用于winform和asp.net应用中.它提供了巨大的灵活性而不 ...
- js高级程序设计
defer 异步脚本,脚本延迟到文档完全被解析和显示之后再执行.只对外部脚本文件有效.按顺序执行脚本.但在实际情况下,并不一定会按照顺序执行最好只有一个延迟脚本.支持H5的浏览器会忽略给脚本设置 de ...
- Mafly.Mail实现发送邮件
安装 打开程序包管理器控制台,执行命令:Install-Package Mafly.MailInstall-Package Newtonsoft.Json.dll 安装之后,项目会自动创建一个Conf ...
- redis centos 6.5 redis版本3.2.8安装过程
redis作为非关系数据库的典型应用,在庞大的数据通信处理有着自己强大的优势,今天也自己来开始学些redis. 以下每一个语句都是我执行的命令. 按照所查资料分析,需要tcl测试工具,这个在cento ...
- JS uint8Array转String
Uint8Array转字符串 function Uint8ArrayToString(fileData){ var dataString = ""; ; i < fileDa ...
- Bootstrap 框架、插件
Bootstrap,前端工程师比较常用的框架.插件,根据它的定义,我们不妨这样理解,Bootstrap就是用于前端开发的一个模板,就是别人做好了我们直接可以搬过来直接使用或者根据自己需要略加修改设计自 ...