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.从计算机到程序设计语言: 理解计算机:计算机是能够根据一组指令操作数据的机器. 功能性:可以进行数据计算 ...
随机推荐
- MVC开发中的常见错误-02-在应用程序配置文件中找不到名为“OAEntities”的连接字符串。
在应用程序配置文件中找不到名为“OAEntities”的连接字符串. 分析原因:由于Model类是数据库实体模型,通过从数据库中引用的方式添加实体,所以会自动产生一个数据库连接字符串,而程序运行到此, ...
- 静态属性property
静态属性property(是通过对象去使用) property是一种特殊的属性,访问它时会执行一段功能(函数)然后返回值 1 . 通过@property修饰过的函数属性,调用的时候无需在加() cla ...
- 配置frp
一.下载 下载地址:https://github.com/fatedier/frp/releases 下载linux_amd64的,如果是32位系统就下载linux_386 二.安装 有公网IP的服务 ...
- C# 操作windows服务[启动、停止、卸载、安装]
主要宗旨:不已命令形式操作windows服务 static void Main(string[] args) { var path = @"E:\开发辅助项目\WCF\WCF.Test\WC ...
- The authenticity of host 'slaver2 (192.168.199.132)' can't be established. RSA key fingerprint is cc:4e:23:01:ca:97:52:21:85:78:bc:29:ca:b3:12:52.
1:ssh登录 The authenticity of host 192.168.199.132 can't be established. 的问题 问题出现了,总要解决吧,百度一下,详细介绍的很多, ...
- [转] Web前端开发工程师常用技术网站整理
1.常用工具相关 有道云笔记 http://note.youdao.com/signIn/index.html 36镇-最好用的共享收藏夹 http://www.36zhen.com/ 浏览器同步测试 ...
- ES标准
精确来说,ES1 ~ ES5 中的数字是 ECMA-262 标准的版本号(edition). 即:Standard ECMA-262, 1st Edition(其实第一个版本是没有版本号的)Stand ...
- POJ 2243 简单搜索 (DFS BFS A*)
题目大意:国际象棋给你一个起点和一个终点,按骑士的走法,从起点到终点的最少移动多少次. 求最少明显用bfs,下面给出三种搜索算法程序: // BFS #include<cstdio> #i ...
- 清北合肥day1
题目: 1.给出一个由0,1组成的环 求最少多少次交换(任意两个位置)使得0,1靠在一起 n<=1000 2.两个数列,支持在第一个数列上区间+1,-1 每次花费为1 求a变成b的最小代价 n& ...
- 【bzoj4031】[HEOI2015]小Z的房间
题解: 矩阵树定理入门题 一个图的邻接矩阵G:对于无向图的边(u,v),G[u][v]++,G[v][u]++ 一个图的度数矩阵D:对于无向图的边(u,v),D[u][u]++,D[v][v]++; ...