博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[C++再学习系列] 隐式类型转换与转换操作符
阅读量:6847 次
发布时间:2019-06-26

本文共 1382 字,大约阅读时间需要 4 分钟。

  C++标准允许隐式类型转换,即对特定的类,在特定条件下,某些参数或变量将隐形转换成类对象(创建临时对象)。如果这种转换代价很大(调用类的构造函数),隐式转换将影响性能。隐式转换的发生条件:函数调用中,参数类型不匹配,如果隐式转换后能满足类型匹配条件,编译器将启用类型转换。

  控制隐式类型转换的两种途径:

1) 减少函数调用的参数不匹配情况:提供签名(函数参数类型)与常见参数类型的精确匹配的重载函数。

2) 限制编译器的启用隐式转换:使用explicit限制的构造函数和具名转换函数。

下面的例子将导致隐式类型转换:

1) 未限制的构造函数:

1
2
3
4
class 
Widget {
// …
    
Widget( unsigned
int 
factor );
    
Widget(
const 
char
* name,
const 
Widget* other = 0 );
};

2) 转换操作符(conversion operators, 定义成operator T(),其中T为C++类型)

1
2
3
4
class 
String {
public
:
    
operator
const 
char
*(); 
//在需要情况下,String 对象可以转成const char*指针。
};

上面的定义将使很多愚蠢的表达式通过编译(编译器启用了隐式转换)。

1
2
3
4
5
6
Assume s1, s2 are Strings:
 
int 
x = s1 - s2;             
// compiles; undefined behavior
const 
char
* p = s1 - 5;  
// compiles; undefined behavior
p = s1 +
'0'
;                 
//compiles; doesn't do what you'd expect
if
( s1 ==
"0" 
) { ...}       
// compiles; doesn't do what you'dexpect

合理的解决方案:

1) 默认时,为单参数的构造函数加上explicit:

1
2
3
4
class 
Widget {
// …
     
explicit 
Widget( unsigned
int 
factor );
     
explicit 
Widget(
const 
char
*name,
const 
Widget* other = 0 );
};

2)使用提供的转换具名函数代替转换操作符(conversion operators):

1
2
3
4
class 
String {
// …
public
:
    
const 
char
* as_char_pointer()
const
;      
// in the grand c_strtradition
};

---------------------------------------------------

兄弟的公司:

欢迎转载,请注明作者和出处。

本文转自 zhenjing 博客园博客,原文链接:http://www.cnblogs.com/zhenjing/archive/2010/11/26/implicit_conversion_and_conversion_operator.html
   ,如需转载请自行联系原作者
你可能感兴趣的文章
如何在内网安装compass
查看>>
TF-IDF理解及其Java实现
查看>>
CRLF line terminators导致shell脚本报错:command not found
查看>>
LeetCode - Combination Sum
查看>>
Mysql 正则获取字段的交集【转】
查看>>
Java NIO2:缓冲区
查看>>
AngularJS 使用$sce控制代码安全检查
查看>>
Linux中ifreq 结构体分析和使用 及其在项目中的简单应用
查看>>
牛客网-《剑指offer》-重建二叉树
查看>>
民用飞机蓄电池选型
查看>>
unity, GUI.Button texture is black
查看>>
CSharpGL(10)两个纹理叠加
查看>>
Linux 删除用户
查看>>
WebApi系列~dynamic让你的省了很多临时类
查看>>
urllib2的异常处理
查看>>
架构之路(九)Session Per Request
查看>>
Educational Codeforces Round 7 E. Ants in Leaves 贪心
查看>>
REST_FRAMEWORK加深记忆-第二次练习官方文档2
查看>>
hdu5188 加限制的01背包问题
查看>>
Volley(四)—— ImageLoader & NetworkImageView
查看>>