隐式转换

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的更多相关文章

  1. 【校招面试 之 C/C++】第18题 C++ 中的隐式转换以及explicit关键字

    1.什么是隐式转换: 众所周知,C++的基本类型中并非完全的对立,部分数据类型之间是可以进行隐式转换的. 所谓隐式转换,是指不需要用户干预,编译器私下进行的类型转换行为.很多时候用户可能都不知道进行了 ...

  2. 21.C++- "++"操作符重载、隐式转换之explicit关键字、类的类型转换函数

    ++操作符重载 ++操作符分为前置++和后置++,比如: ++a;  a++; ++操作符可以进行全局函数或成员函数重载 重载前置++操作符不需要参数 重载后置++操作符需要一个int类型的占位参数 ...

  3. C#中的隐式转换

    你是否考虑过这个问题:为什么不同类型之间的变量可以赋值,而不需要强制转换类型?如: int i = 1; long l = i; object obj = 1; Exception exception ...

  4. JavaScript中关于隐式转换的一些总结

    JavaScript运算符中的隐式转换规律:一.递增递减运算符(前置.后置)1.如果包含的是有效数字字符串或者是有效浮点数字符串,则会将字符串转换(Number())为数值,再进行加减操作,返回值的类 ...

  5. Scala 中的隐式转换和隐式参数

    隐式定义是指编译器为了修正类型错误而允许插入到程序中的定义. 举例: 正常情况下"120"/12显然会报错,因为 String 类并没有实现 / 这个方法,我们无法去决定 Stri ...

  6. mysql中的隐式转换

    在mysql查询中,当查询条件左右两侧类型不匹配的时候会发生隐式转换,可能导致查询无法使用索引.下面分析两种隐式转换的情况 看表结构 phone为 int类型,name为 varchar EXPLAI ...

  7. Js 中那些 隐式转换

    曾经看到过这样一个代码:  (!(~+[])+{})[--[~+""][+[]]*[~+[]]+~~!+[]]+({}+[])[[~!+[]*~+[]]] = sb , 你敢相信, ...

  8. MySQL性能优化:MySQL中的隐式转换造成的索引失效

    数据库优化是一个任重而道远的任务,想要做优化必须深入理解数据库的各种特性.在开发过程中我们经常会遇到一些原因很简单但造成的后果却很严重的疑难杂症,这类问题往往还不容易定位,排查费时费力最后发现是一个很 ...

  9. js中的隐式转换

    js中的不同的数据类型之间的比较转换规则如下: 1. 对象和布尔值比较 对象和布尔值进行比较时,对象先转换为字符串,然后再转换为数字,布尔值直接转换为数字 [] == true; //false [] ...

随机推荐

  1. Opencv for android 模板匹配

    因为有这方面的需要所以,对模板查找搜寻了相关资料,只是对于算法的东西很难看得动,特别是opencv涉及的很多的数学方法. 所以只为了实现这个功能,因为需求比较简单,在网上也搜寻到了相关代码,就直接拿来 ...

  2. 你知道python入门,是学到什么程度才算是吗?

    1.入门的标准是什么? 这是很多初学者都关注的问题,但又是一个很难回答的问题,问题的核心是采取什么标准来衡量一个人是否已经入门. 以知识量的多少来衡量是不是可行呢?有些人走马观花一般学了很多pytho ...

  3. OkHttp 优雅封装 OkHttps 之 回调线程魔变

    第一篇:OkHttp 优雅封装 HttpUtils 之 气海雪山初探 第二篇:OkHttp 优雅封装 HttpUtils 之 上传下载解密 简介 HttpUtils 从 v2.3.0 之后便重命名了, ...

  4. 如何将SqlServer配置为django的数据源(2.2以后版本)

    django-pyodbc-azure 是一个官方推荐的 第三方django数据库支持backend. 根据官网的介绍django-pyodbc-azure 只能支持到 django 2.1.如果涉及 ...

  5. 乱 七 八 糟 $(n.)$

    \(2020/4/22\) 今天常规作业还是太慢了,白天似乎已经抓紧了,但总还能挤出时间来的.八点钟了还有物理和英语作业,回去又得很晚睡. 还是容易开小差,不过回忆了一下,今天化学课还是太懒散,其余的 ...

  6. Springboot:配置文件位置以及多环境配置(六)

    配置文件位置 Springboot配置文件可以加载以下四个位置: file:./config/ #第一加载位置 file:./ #第二加载位置 classpath:/config/ #第三加载位置 c ...

  7. 单图像三维重建、2D到3D风格迁移和3D DeepDream

    作者:Longway Date:2020-04-25 来源:单图像三维重建.2D到3D风格迁移和3D DeepDream 项目网址:http://hiroharu-kato.com/projects_ ...

  8. 2018版移动端ui规范

    计规范是一种将移动端常用控件标准化.统一化的的文档 今天整理了一篇设计规范的文章概论,讲诉中会以ios做介绍,安卓由于开源,平台相对教多不做单一阐述,实际操作的时候,我们不管是做一代还是二次的迭代产品 ...

  9. 如何用TensorFlow实现线性回归

    环境Anaconda 废话不多说,关键看代码 import tensorflow as tf import os os.environ['TF_CPP_MIN_LOG_LEVEL']='2' tf.a ...

  10. curl发送多维数组

    //通过curl模拟post的请求: function SendDataByCurl($url,$data=array()){ //对空格进行转义 $url = str_replace(' ','+' ...