C++的隐式类型转换与转换操作符
C++标准允许隐式类型转换,即对特定的类,在特定条件下,某些参数或变量将隐形转换成类对象(创建临时对象)。如果这种转换代价很大(调用类的构造函数),隐式转换将影响性能。隐式转换的发生条件:函数调用中,参数类型不匹配,如果隐式转换后能满足类型匹配条件,编译器将启用类型转换。
控制隐式类型转换的两种途径:
1) 减少函数调用的参数不匹配情况:提供签名(函数参数类型)与常见参数类型的精确匹配的重载函数。
2) 限制编译器的启用隐式转换:使用explicit限制的构造函数和具名转换函数。
下面的例子将导致隐式类型转换:
1) 未限制的构造函数:
class Widget { // …
Widget( unsigned int factor );
Widget( const char* name,const Widget* other = );
};
2) 转换操作符(conversion operators, 定义成operator T(),其中T为C++类型)
class String {
public:
operator const char*(); //在需要情况下,String 对象可以转成const char*指针。
};
上面的定义将使很多愚蠢的表达式通过编译(编译器启用了隐式转换)。
Assume s1, s2 are Strings: int x = s1 - s2; // compiles; undefined behavior
const char* p = s1 - ; // compiles; undefined behavior
p = s1 + ''; //compiles; doesn't do what you'd expect
if( s1 == "" ) { ...} // compiles; doesn't do what you'dexpect
合理的解决方案:
1) 默认时,为单参数的构造函数加上explicit:
class Widget { // …
explicit Widget( unsigned int factor );
explicit Widget( const char*name, const Widget* other = );
};
2)使用提供的转换具名函数代替转换操作符(conversion operators):
class String { // …
public:
const char* as_char_pointer()const; // in the grand c_strtradition
};
C++的隐式类型转换与转换操作符的更多相关文章
- c++ operator操作符的两种用法:重载和隐式类型转换,string转其他基本数据类型的简洁实现string_cast
C++中的operator主要有两个作用,一是操作符的重载,一是自定义对象类型的隐式转换.对于操作符的重载,许多人都不陌生,但是估计不少人都不太熟悉operator的第二种用法,即自定义对象类型的隐式 ...
- 用ECMAScript4 ( ActionScript3) 实现Unity的热更新 -- 操作符重载和隐式类型转换
C#中,某些类型会定义隐式类型转换和操作符重载.Unity中,有些对象也定义了隐式类型转换和操作符重载.典型情况有:UnityEngine.Object.UnityEngine.Object的销毁是调 ...
- Qt 中C++ static_cast 和 reinterpret_cast的区别(static_cast是隐式类型转换,会有数据损失,reinterpret_cast是底层二进制转换,没有数据损失)
1.C++中的static_cast执行非多态的转换,用于代替C中通常的转换操作.因此,被做为隐式类型转换使用.比如: int i; float f = 166.7f; i = static_cast ...
- [Effective JavaScript笔记]第3条:当心隐式的强制转换
js对类型错误出奇的宽容 3+true; //4 3*””; //0 3+[]; //3 3+[3]; //33 以上表达式在许多语言早就变红了.而js不但不报错还给你个结果. 极少情况会产生即时 ...
- JavaScript之隐式类型转换
布尔操作符(!.&&.||) 当使用 条件判断语句(if...else) 以及 布尔操作符(!.&&.||) 时,会调用Boolean()进行隐式类型转换 转换为fal ...
- operator用法:隐式类型转换
operator它有两种用法,一种是operator overloading(操作符重载),一种是operator casting(操作隐式转换). 1.操作符重载C++可以通过operator实现重 ...
- C++ 中operator用法:隐式类型转换
[转]C++ operator两种用法 C++,有时它的确是个耐玩的东东,就比如operator,它有两种用法,一种是operator overloading(操作符重载),一种是operator c ...
- '2'>'10'==true? JS是如何进行隐式类型转换的?
前言 '2'>'10'返回的true,可能很多人都不是很能理解吧? 在js中,当运算符在运算时,如果两边数据不统一,CPU就无法计算,这时我们编译器会自动将运算符两边的数据做一个数据类型转换,转 ...
- dynamic_cast 和 static_cast 隐式类型转换的区别
首先回顾一下C++类型转换: C++类型转换分为:隐式类型转换和显式类型转换 第1部分. 隐式类型转换 又称为“标准转换”,包括以下几种情况:1) 算术转换(Arithmetic conversion ...
随机推荐
- 用Python3实现表达式求值
一.题目描述 请用 python3 编写一个计算器的控制台程序,支持加减乘除.乘方.括号.小数点,运算符优先级为括号>乘方>乘除>加减,同级别运算按照从左向右的顺序计算. 二.输入描 ...
- NSFileManager计算文件/文件夹大小
在一些软件中,一般都会给用户展现当前APP的内存,同时用户可以根据自己的需要来清除缓存的内容.一般而言,文件夹是没有大小这个属性的,所以需要遍历文件夹的内容来计算文件夹的大小,下面用NSFileMan ...
- NueGet设置package Source
package Source为:http://packages.nuget.org/v1/FeedService.svc/ 最新的地址(2015-4-10):https://www.nuget.org ...
- 一个文件夹可以link 到另外一个文件夹
Creates a symbolic link. MKLINK [[/D] | [/H] | [/J]] Link Target /D Creates a directory symboli ...
- Dr.com──加密方式(网页端)
Dr.com是城市热点公司开发的宽带计费系统,可以控制网络进行管理,认证,计费,限速……许多的高校与企业都有使用. 从接触到drcom就很感兴趣(原因想必大家都懂...) drcom登陆(认证)方式又 ...
- 瀑布流布局(jq实现)
参考刘晓帆大神的瀑布流效果 自己也写了个 希望能给打算写这个效果的朋友一点点思路,也希望朋友们批评指正! html代码: <!DOCTYPE html> <html> < ...
- Bullet的学习资源(用Doxygen生成API文档)
Bullet 全称 Bullet Physics Library,是著名的开源物理引擎(可用于碰撞检测.刚体模拟.可变形体模拟),这里将bullet的学习资源整理一下,希望能帮助入门者少走弯路. 看下 ...
- 关于Kean博客的学习
由于我从事设计行业,使用Autocad进行绘图是一件单调但是拥有乐趣的工作. 大约在一年前,接触到了CAD的二次开发的内容,它使我感到新奇,并且决定花时间来研究相关的知识.这时我在网上浏览到了Kean ...
- 开启Java博客
已经转Java大半年了,Java知识都来自于工作,没有一个系统的学习,所以这一个多月我都在看Java的一些基本东西,准备系统性的学习下Java知识.这一个多月看的也挺多,从servlet,jsp,st ...
- 什么是html技术
HTML(Hyper Text Mark-up Language )即超文本标记语言,是 WWW 的描述语言,由 Tim Berners-lee提出.设计 HTML 语言的目的是为了能把存放在一台电脑 ...