C++中的隐式转换和explicit
隐式转换
c++中的数据类型转换分为隐式转换和显示转换;
- 显示转换即使用static_cast等方法进行转换,相关内容请参考 《C++数据类型转换》;
- 隐式转换则是编译器完成的,如,bool和 int 之间的默认转换;
- 实际开发中,应尽量避免使用隐式转换,代码是给人看的,不是用来炫技的;
类构造中的隐式转换
隐式转换有时候很方便,但是有时候却会产生不易察觉的错误。下面以类构造函数中的隐式转换为例:
//test.h
class Test
{
public:
Test(int value){
this->value = value;
}
int GetValue() const{
return this->value;
}
private:
int value;
};
//main.cpp
void Function(const Test& test){
cout<<test.GetValue();
}
void main(){
Test test(123);
Function(test);
}
- 如上,代码很简单,Test在构造时需要传入一个 int 型的参数;
- Function()函数需要传入一个 const 的 Test 对象作为函数参数;
但是,若main()函数出现下面的代码,则会如何?
void main(){
Function(123);
}
事实是,这样也会正常运行,其实不难理解,这就是利用了类构造的隐式转换完成的。
- Function() 方法在接收到参数123后,使用Test的构造函数构造了一个临时的Test对象;
- 因为对象是临时且无法更改的,所以,这里的函数参数需要 const,拿掉则编译错误;
这里的代码看起来非常巧妙,但是却是真正意义上的“奇技淫巧”,老老实实构造一个对象,不好吗?
那么,这里使用隐式转换有什么缺点呢?
最大的问题就是维护,这里示例的代码量少,尚且觉得巧妙,对于中型及其以上的的工程来说,这就是维护的噩梦。
使用explicit来禁用构造函数的隐式转换
上例中的构造函数中的隐式转换可以使用 explicit 来禁用
//test.h
class Test
{
public:
explicit Test(int value){
this->value = value;
}
int GetValue() const{
return this->value;
}
private:
int value;
};
//main.cpp
void Function(const Test& test){
cout<<test.GetValue();
}
void main(){
Function(123); //编译到这里就会报错
}
在实际开发中,应尽量避免使用隐式转换,越是看似巧妙,越要避免。
C++中的隐式转换和explicit的更多相关文章
- 【校招面试 之 C/C++】第18题 C++ 中的隐式转换以及explicit关键字
1.什么是隐式转换: 众所周知,C++的基本类型中并非完全的对立,部分数据类型之间是可以进行隐式转换的. 所谓隐式转换,是指不需要用户干预,编译器私下进行的类型转换行为.很多时候用户可能都不知道进行了 ...
- 21.C++- "++"操作符重载、隐式转换之explicit关键字、类的类型转换函数
++操作符重载 ++操作符分为前置++和后置++,比如: ++a; a++; ++操作符可以进行全局函数或成员函数重载 重载前置++操作符不需要参数 重载后置++操作符需要一个int类型的占位参数 ...
- C#中的隐式转换
你是否考虑过这个问题:为什么不同类型之间的变量可以赋值,而不需要强制转换类型?如: int i = 1; long l = i; object obj = 1; Exception exception ...
- JavaScript中关于隐式转换的一些总结
JavaScript运算符中的隐式转换规律:一.递增递减运算符(前置.后置)1.如果包含的是有效数字字符串或者是有效浮点数字符串,则会将字符串转换(Number())为数值,再进行加减操作,返回值的类 ...
- Scala 中的隐式转换和隐式参数
隐式定义是指编译器为了修正类型错误而允许插入到程序中的定义. 举例: 正常情况下"120"/12显然会报错,因为 String 类并没有实现 / 这个方法,我们无法去决定 Stri ...
- mysql中的隐式转换
在mysql查询中,当查询条件左右两侧类型不匹配的时候会发生隐式转换,可能导致查询无法使用索引.下面分析两种隐式转换的情况 看表结构 phone为 int类型,name为 varchar EXPLAI ...
- Js 中那些 隐式转换
曾经看到过这样一个代码: (!(~+[])+{})[--[~+""][+[]]*[~+[]]+~~!+[]]+({}+[])[[~!+[]*~+[]]] = sb , 你敢相信, ...
- MySQL性能优化:MySQL中的隐式转换造成的索引失效
数据库优化是一个任重而道远的任务,想要做优化必须深入理解数据库的各种特性.在开发过程中我们经常会遇到一些原因很简单但造成的后果却很严重的疑难杂症,这类问题往往还不容易定位,排查费时费力最后发现是一个很 ...
- js中的隐式转换
js中的不同的数据类型之间的比较转换规则如下: 1. 对象和布尔值比较 对象和布尔值进行比较时,对象先转换为字符串,然后再转换为数字,布尔值直接转换为数字 [] == true; //false [] ...
随机推荐
- 【JAVA】并发-基础IO
一.java.io包支持.java的IO流有输入.输出两种,每种输入.输出流又可分为字节流.字符流两大类,字节流以字节为单位处理IO操作,字符流以字符为单位处理IO操作 JDK 1.4以后有java. ...
- Git敏捷开发--常用别名
前言 在Unix下终端开发时,经常会搭配 oh-my-zsh 来使用. oh-my-zsh 中默认内置 git 插件,且支持许多 git alias 的命令,这里对常见的命令进行总结,以供查阅. 常用 ...
- 不同目录有同名proto文件情况下,protoc生成.cc/.h
首先先参考一下别人的博客,看完了,看懂了,再回过头来看我下面说的情况. 链接 https://blog.csdn.net/CAir2/article/details/78201572 但是这个也就是基 ...
- Cucumber(3)——命令以及日志
目录 回顾 基本执行命令 关于日志的生成 回顾 在上一节中,我介绍了cucumber一些基本的语法内容,如果你还没有进行相关的了解或者环境的配置,你可以点击这里来进行了解一下 在本节中,我会对cucu ...
- sysbench安装和使用
sysbench是一款测试工具 主要包括以下几种方式的测试: 1.cpu性能 2.磁盘io性能 3.调度程式性能 4.内存分配及传输速度 5.POSIX线程性能 6.数据库性能(OLTP基准测试)现在 ...
- PHP xml 外部实体注入漏洞学习
XML与xxe注入基础知识 1.XMl定义 XML由3个部分构成,它们分别是:文档类型定义(Document Type Definition,DTD),即XML的布局语言:可扩展的样式语言(Exten ...
- 基于TextRank算法的文本摘要
本文介绍TextRank算法及其在多篇单领域文本数据中抽取句子组成摘要中的应用. TextRank 算法是一种用于文本的基于图的排序算法,通过把文本分割成若干组成单元(句子),构建节点连接图,用句子之 ...
- Scapy的基本使用
关于Scapy Scapy是一个可以让用户发送.侦听和解析并伪装网络报文的Python程序.这些功能可以用于制作侦测.扫描和攻击网络的工具. 换言之,Scapy 是一个强大的操纵报文的交互程序.它可以 ...
- Mysql中的一些类型
列类型--整数类型Tinyint:迷你整形 一个字节=8位 最大能表示的数值是0-255 实际区间 -128~127Smallint:小整形 两个字节 能表示0-65535Mediumint:中整型 ...
- 2层感知机(神经网络)实现非线性回归(非线性拟合)【pytorch】
import torch import numpy import random from torch.autograd import Variable import torch.nn.function ...