要小心隐式类型转换

C++:单参数构造函数的隐式转换 C++:单参数构造函数的隐式转换20200416举个例子push_back()的右值引用参考内容 20200416 在做智能指针测试的时候调用了vector数组 vector< auto_ptr<int> > a_v; //USAGE ERROR //a_v.push_back(new int(999)); //ERROR /* 这里push_back执行报... 阅读详情

 C++中包含很多隐含规则,如果对这些隐含规则掌握不清楚,往往出了问题都无从查起,隐式类型转换就是其中之一。
 (1)、单参数构造函数(single argument constructor)会导致隐式类型转换
 例如,你有这样一个类:
 class MyClass
 {
  char *szBuffer;
 public:
  MyClass()
  {
   szBuffer=NULL;
  }
  MyClass(int size)
  {
   szBuffer=new char[size];
   memset(szBuffer,0,size);
  }
  ~MyClass()
  {
   delete[] szBuffer;
  }
  ....
 };
 写一个构造函数带一个int参数来指定初始分配多大的缓冲似乎无可厚非,但是如果您或者别人不小心写下了这么一句:
 //MyClass test;
 test=256;
 那么编译器会先使用“MyClass(int size)”构造一个临时对象,然后再调用赋值操作符,将这个临时对象赋值给test对象。即使你很谨慎的为MyClas写了赋值操作符(const MyClass& operator = (const MyClass& other)),情况也是一样糟糕,因为test对象的内容被清空了。
 如果你没有写赋值操作符,那么情况将一片混乱!编译器会使用默认的赋值操作,即位拷贝,而临时对象在完成赋值操作之后会被释放,临时对象的析构函数被调用,此时临时对象的szBuffer和test的szBuffer成员已经指向了同一块内存,所以后续对test的szBuffer成员的操作将无法预料。
 为了避免这个问题,C++引入了explicit关键字,将函数声名做一下修改:explicit MyClass(int size),“ test=256;”这一句就无法编译通过了。

 (2)、赋值操作符也可以引起类型转换
 接上例,如果MyClass有一个成员函数“const MyClass& operator = (int t)”,那么“test=256;”就又可以编译通过了,不过这种写法在实际中很少见到。
 
 (3)、慎用类的类型转换函数(user-defined conversion function)
 用MFC的时候觉得CString,CRect很方便,如果函数的参数是LPCTSTR(即const char*)或者LPRECT(即RECT*),对象依然可以传进去。这就是因为CString和CRect类都有相应的作符。类型转换函数有时是很方便的,例如有一个类:
 class MyColor
 {
 public:
  unsigned char A,R,G,B;

  operator unsigned int () const
  { 
   return (A << 24) | (R << 16) | (G << 8) | B; 
  }
 };
 MyColor用来分别存储一个颜色值的a,r,g,b四个分量,把这个类的实例转换成一个32位的值是一个常用的操作,所以写了这样一个成员函数,用起来很方便:
 MyColor test;
 unsigned int a=test;
 
 如果写下了这样一句,目的是比较每个分量的大小,那就要小心了:
 MyColor test;
 MyColor test2;
 bool b=test>test2;
 虽然MyColor并没有写“operator >”,但是这一句还是可以编译运行的。编译器经过函数重载解析,会对test和test2进行隐式类型转换,然后在所有的>操作符中找到匹配的。“test>test2”实际上是将test和test2都转换成了unsigned int,然后再进行比较!


参考资料:
《C++ Primer》 Stanley B.Lippman、Josee Lajoie,潘爱民、张丽译
《Effective C++》 Scott Meyers,侯捷译
《C++标准程序库》 Nicolai M.Josuttis,候捷、孟岩译
 

【C语言】隐式类型转换和强制类型转换详解 C语言中的数据类型是编程中一个至关重要的概念。在处理不同数据类型的操作时,我们经常需要考虑类型之间的转换。隐式类型转换(也称自动类型转换)和强制类型转换(也称显式类型转换)。本博客将深入讨论这两种转换方式的概念、用法以及注意事项,帮助读者更好地理解C语言中的类型转换机制。提示:以下是本篇文章正文内容,下面案例可供参考C语言中的类型转换是编程中不可避免的一部分,而隐式类型转换和强制类型转换则是两种不同的策略。隐式类型转换使得编程更灵活,但有时也会导致意外行为。 阅读详情

相关推荐

【C++】类的隐式类型转换

C++ 类的隐式类型转换是指当一个类定义了适当的构造函数或转换函数时,可以在需要时自动进行类型转换,而无需显式调用转换函数或构造函数。这使得代码更具灵活性和简洁性。下面是一些关于类的隐式类型转换的示例:public:MyString(const char* str) : data(str) {} // 构造函数,将 const char* 转换为 MyStringprivate:// 隐式类型转换:const char* 转换为 MyString// 输出 "Hello, World!

weixin_70273825的博客 1151

【C++基础知识】初始化列表,单参构造函数的隐式类型转换

文章目录初始化列表:单参构造函数的隐式类型转换 explicit关键字 初始化列表: ​ 以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个成员变量后面跟一个放在括号中的初始值或表达式。 例如: class Date { public: Date(int year, int month, int day): _year(year), _month(month), _day(day) {} private: int _year; int _month; int _day; };

weixin_43962381的博客 666

单参数的构造函数带来的隐式转换

构造函数会引起一个不引人注意的问题: 用单个实参来调用的构造函数定义了从从形参类型到类类型的一个隐式转换。 举个例子说: class Sales_item { public: std::istream&amp; input(std::istream&amp; in); std::ostream&amp; output(std::ostream&amp; out); inline dou...

java开发指南博客 【转载】 500

Vivado Combinatorial Loop Alert问题 [DRC LUTLP-1]

Vvado综合和布局布线都通过了但是无法生成bit文件,提示Combinatorial Loop Alert,错误如下图。在RTL图中可以看到LUT的输出连接到了输入上,这个就是。在代码中我并未找到导致这种情况发生的地方,如果遇到类似的问题先检查自己的代码是不是存在组合逻辑连接出现了问题,如果没问题再考虑通过设置去解决问题。

伊丽莎白的学习之路 6031

scannet数据集下载文件

scannet数据集下载文件 由于大家会申请scannet数据集,审批比较慢,我将下载的文件里面的内容贴出来,大家可以复制放进py文件中,运行就可以下载 ps:别再私信要数据集了,这个自己下载,如果光三维数据的话,还是很快的,当然如果路由器翻了墙的话,下载会更快。 #!/usr/bin/env python # Downloads ScanNet public data release # Run with ./download-scannet.py (or python download-scannet.

weixin_40766438的博客 9231

隐式(自动)数据类型转换

一.算术运算符中的转换规则: double ←── float 高↑long↑unsigned↑int ←── char,short 低 注意:图中横向箭头表示必须的转换,如两个float型数参加运算,虽然它们类型相同,但仍要先转成double型再进行运算,结果亦为double型。纵向箭头表示当运算符两边的运 算数为不同类型时的转换,如一个long 型数据与一个int型数据一起运算,需要先将i...

图像学习之旅 575

8155源码编译DSP(ubuntu环境下)

一.设置环境变量 -users:/$ sudo gedit ~/.bashrc #set adsp cdsp tools path #export ARMLMD_LICENSE_FILE=<LICENSE FILE INFO> #export ARMTOOLS=RVCT221 #export ARMROOT=/pkg/asw/compilers/arm/ADS1.2 #export ARM_COMPILER_PATH=/pkg/qct/software/arm/RVDS/2.2BLD593

Johnny2004的专栏 1676

【C语言进阶剖析】4.C语言中的类型转换

文章目录 一、类型之间的转换 二、强制类型转换 三、隐式类型转换 四、表达式中的隐式类型转换 五、小结 一、类型之间的转换 C语言中的数据类型可以进行转换 强制类型转换 隐式类型转换 二、强制类型转换 强制类型转换的语法 (Type)var_name; (Type)value; 强制类型转换的结果 目标类型能够容纳目标值:结果不变 目标类型不能容纳目标值:结果将产生截断 注意:不是所有的强制类型转换都能成功,当不能进行强制类型转换时,...

老胡的博客 476

NR PUCCH(二)PUCCH format 2/3/4

继续看PUCCH2/3/4:PUCCH format 0和1所携带的信息bits少,UCI bits2bits,信息bit需要经过编码等过程下面分别来看。

ModemProtocol的博客 538

人工智能算法面试大总结-总目录

涉及秋招、春招、社招

啥都生的博客 2万+

小心隐式类型转换

       数据库为了保证SQL能够正常执行,总会提供一些友好性来满足那些看起来对的SQL正常执行,比如隐式类型转换的使用,万字不如code,来看个具体碰到的问题:    首先创建表: create table CONVERT_SHOW ( USER_ID bigint(8), NAME varchar(8...

hejianhuacn的专栏 208

C++ getline函数详解与示例代码

每次调用函数时,会读取一行文本,并将其存储在字符串对象中。在循环中,我们检查读取到的文本是否为空行,如果是则跳出循环,否则输出读取到的文本。这个函数在处理用户输入、文件读取等场景中非常有用,希望能对您的C++编程有所帮助。函数是一个常用的字符串输入函数,可以用于从输入流中读取一行文本。首先,我们输出提示信息,要求用户输入一行文本。函数会等待用户输入,并将输入的文本存储在。函数从输入流中读取一行文本,并将其存储在字符串对象。这样,当用户输入制表符时,函数会停止读取。函数的用法,并提供相应的示例代码。

LogicGuruX的博客 827

c语言隐式类型转换——小心!

今天查一个和RTP协议有关的bug,代码不是我写的,如果是我写很有可能也会犯这个错误。   为了对应这个问题,我先是把网上关于RTP协议的博客又大致看了一遍,然后有把出错的函数的功能简单过了一遍。 又把调试信息打印了一遍。最后基本确定是隐式类型转换的问题,不需要做什么大的改动。 因为是前人写的代码,理解和修改都得小心翼翼,怕改了引发新的bug。   错误代码:   if ((packe...

cyan 689

手把手教你学simulink实例--基于Simulink的船舶动力定位系统建模与仿真

船舶动力定位系统(Dynamic Positioning System, DPS)是一种通过控制推进器来保持船舶在指定位置和航向的技术。它广泛应用于海上钻井平台、海洋调查船、起重船等需要精确位置控制的场景。DPS的核心任务是实时感知环境干扰(如风、浪、流),并通过闭环控制算法调整推进器输出,以抵消外界扰动并维持船舶的位置和姿态。本项目旨在基于MATLAB/Simulink平台,构建船舶动力定位系统的数学模型,并进行仿真分析,验证其性能和稳定性。

MHD0815的博客 1083

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

小心MySQL的隐式类型转换陷阱

1. 隐式类型转换实例 今天生产库上突然出现MySQL线程数告警,IOPS很高,实例会话里面出现许多类似下面的sql:(修改了相关字段和值) SELECT f_col3_id,f_qq1_id FROM d_dbname.t_tb1 WHERE f_col1_id=1226391 and f_col2_id=1244378 and f_...

weixin_34198453的博客 217

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

mysql转double_小心MySQL的隐式类型转换陷阱

1. 隐式类型转换实例今天生产库上突然出现MySQL线程数告警,IOPS很高,实例会话里面出现许多类似下面的sql:(修改了相关字段和值)SELECT f_col3_id,f_qq1_id FROM d_dbname.t_tb1 WHERE f_col1_id=1226391 and f_col2_id=1244378 andf_qq1_id in (12345,23456,34567,45678...

weixin_30701661的博客 541

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

mysql 隐式失误_小心MySQL的隐式类型转换陷阱

1. 隐式类型转换实例今天生产库上突然出现MySQL线程数告警,IOPS很高,实例会话里面出现许多类似下面的sql:(修改了相关字段和值)SELECT f_col3_id,f_qq1_id FROM d_dbname.t_tb1 WHERE f_col1_id=1226391 and f_col2_id=1244378 andf_qq1_id in (12345,23456,34567,45678...

weixin_30611227的博客 259

C之不小心就犯错误1-隐式类型转换

根据C语言隐式类型转换的原理,如果是int型与uint型进行比较(其它类型同理),则会将int型数据转换为uint型,则-1变成了 2^32-1 = 4294967295。

heyangge的博客 260

学习笔记(26):高性能MySQL实战课-小心隐式类型转换的陷阱

新课限时福利 限时福利1:原价 129 元,今日特价仅需 69 元!(7月前课程更新完毕)! 限时福利2:购课进答疑群专享柳峰(刘运强)老师答疑服务 限时福利3:购课添加助教领取价值 800 元的编程大礼包 为什么需要掌握高性能的MySQL实战? 由于互联网产品用户量大、高...

zbx1261438150的博客 2851

datetime 索引_面试必备,MySQL索引优化实战总结,涵盖了几乎所有索引注意事项...

本文为小编原创文章,首发于Java识堂,一个高原创,高收藏,有干货的微信公众号,一起成长,一起进步,欢迎关注索引的种类众所周知,索引类似于字典的目录,可以提高查询的效率。索引从物理上可以分为:聚集索引,非聚集索引从逻辑上可以分为:普通索引,唯一索引,主键索引,联合索引,全文索引索引优化策略不要在索引列上进行运算或使用函数在列上进行运算或使用函数会使索引失效,从而进行全表扫描。如下面例子在publi...

weixin_39968995的博客 315

Java 开发中的 9 个实用避坑技巧:实战案例解析

以上 9 个技巧涵盖了 Java 开发中常见的坑点,了解这些可以帮助你在日常开发中编写更健壮、可靠的代码。希望这篇实战避坑指南能够帮助你规避一些常见问题,提升开发效率和代码质量。

龚小帅的博客 1481

datetime 索引_MySQL 索引优化实战

来自:Java识堂(微信号:erlieStar)索引的种类众所周知,索引类似于字典的目录,可以提高查询的效率。索引从物理上可以分为:聚集索引,非聚集索引从逻辑上可以分为:普通索引,唯一索引,主键索引,联合索引,全文索引索引优化策略不要在索引列上进行运算或使用函数在列上进行运算或使用函数会使索引失效,从而进行全表扫描。如下面例子在publish_time,id列上分别加上索引,publis...

weixin_39897687的博客 520

c++ cast type , static_cast and reinterpret_cast

static_cast 用法:static_cast ( expression ) 该运算符把expression转换为type-id类型,但没有运行时类型检查来保证转换的安全性。它主要有如下几种用法:   ①用于类层次结构中基类和子类之间指针或引用的转换。   进行上行转换(把子类的指针或引用转换成基类表示)是安全的;   进行下行转换(把基类指针或引用转换成子类表示)时,由于没

_Max 639

mysql查询隐式类型转换_mysql: 隐式类型转换

前些天有个同事说他数据库查询性能很差,对查询的列加了索引还是很慢。我一看他的表结构和代码转换出的查询语句,大概知道是什么问题 — 出现了隐式类型转换。当我们对不同类型的值进行比较时,MySQL 为了让这些不同类型的值可比较,就会对它们进行类型转换。通过 MySQL 文档 我们可以查看有哪些情况会出现类型转换。最常见的情况就是 一个字符类型的列在查询的时候我们传递了一个数字,举个例子,建张表,随便灌...

weixin_33603656的博客 345
上一篇: 疑难杂症备忘:3DS MAX 5.1插件的链接错误
下一篇: 不轻易打断别人的工作--给刚参加工作的同学们的一个建议
yanonsoftware
博客等级 码龄21年 104粉丝 67原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值