Guru of the Week 条款19:自动转换

原创 2001年12月24日 13:38:00

GotW #19 Automatic Conversions<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

著者:Herb Sutter

翻译:K ][ N G of @rk™

[声明]:本文内容取自www.gotw.ca网站上的Guru of the Week栏目,其著作权归原著者本人所有。译者kingofark在未经原著者本人同意的情况下翻译本文。本翻译内容仅供自学和参考用,请所有阅读过本文的人不要擅自转载、传播本翻译内容;下载本翻译内容的人请在阅读浏览后,立即删除其备份。译者kingofark对违反上述两条原则的人不负任何责任。特此声明。

 

Revision 1.0

 

Guru of the Week 条款19:自动转换

 

难度:4 / 10

 

(从一种型别到另一种型别的自动转换有时是极度方便的。本期GotW通过一个典型的例子说明为什么自动转换同时也是极度危险的。)

 

[问题]

标准的string不具有向const char*进行自动转换的能力。它应该有吗?

* * * * *

[背景]:把string作为C风格的const char*来进行访问,经常是很有用的。实际上,string也确有一个成员函数c_str()专门用来完成这个任务——该函数返回const char*。下面的代码体现出两者的区别:

如果能做到#1就再好不过了,但#1却是错误的,因为strcmp需要的是两个指针,而stringconst char*之间却不存在自动转换。#2是正确的,但却因为要显式的调用c_str()而使代码变长。如果我们能使用#1难道不是更好一些吗?

 

[解答]

标准的string不具有向const char*进行自动转换的能力。它应该有吗?

不,理所不该。避免编写自动转换几乎总是一个可取的办法,不管是以转换运算符编写还是以single-argument non-explicit constructor(单引数非显式构造函数)编写。[1]

说隐式转换一般是不安全的,有两个主要原因:

a)       它会影响重载解析(overload resolution);并且

b)      它会使“错误的”代码被不声不响的编译通过。

如果存在一个从stringconst char*的自动转换,那么这个转换动作将会在任何编译器认为需要的地方被调用。这便意味着,你会遇到各种各样的转换问题——与你在采用non-explicit转换构造函数时所遇到的问题是一样的。你将会很容易的写出看上去正确而实际上不正确的代码,这些代码原则上应该导致失败,但却可能由于古灵精怪的巧合而被编译通过并完成了与预期完全不同的操作。

有很多这样的例子。下面就是一个简单的例子:

其中的减法毫无意义,应该是错误的。然而,如果存在从stringconst char*的隐式转换,那么这段代码就会被编译通过,因为编译器会不声不响的将两个string转换为const char*,然后对两个指针施以相减操作。

摘自GotW编码标准,作为小结:

——避免编写转换运算符(Meyers96: 24-31; Murray93: 38, 41-43; Lakos96: 646-650

 

[1]:这里我所关注的是隐式转换的普遍问题;其实关于「为什么string class不应该具有向const char*的转换」这个问题,还有其它一些原因。这儿有几个进一步讨论该内容的参考:

Koenig97: 290-292

Stroustrup94 (D&E): 83

 

[部分参考]

    Koenig97        Andrew Koenig.

                    "Ruminations on C++"

                    Addison-Wesley, 1997

    Lakos96         John Lakos.

                    "Large-Scale C++ Software Design"

                    Addison-Wesley, 1996

    Meyers96        Scott Meyers.

                    "More Effective C++"

                    Addison-Wesley, 1996

    Murray93        Robert Murray.

                    "C++ Strategies and Tactics"

                    Addison-Wesley, 1993

    Stroustrup94    Bjarne Stroustrup.

    (or D&E)        "The Design and Evolution of C++"

                    Addison-Wesley, 1994

(完)

effective stl 第19条:理解相等(equality)和等价(equivalence)的区别

#include #include #includeusing namespace std;bool ciStringCompare(const string l, const string r) {...
  • u014110320
  • u014110320
  • 2016年09月20日 23:36
  • 238

《Effective C++》设计与声明:条款18-条款19

这两个条款讲的是:接口的设计和类的设计。其中接口的设计原则是让接口容易被正确使用,不容易被误用;后面有一系列的做法。类的设计,讲的是类设计犹如新类型type的设计。在设计类时要考虑的一系列问题。...
  • KangRoger
  • KangRoger
  • 2015年01月21日 21:43
  • 1326

《算法分析与设计》Week 19

287. Find the Duplicate Number Description: Given an array nums containing n + 1 integer...
  • Small_Hacker
  • Small_Hacker
  • 2017年06月04日 20:23
  • 159

windows下用eclipse+goclipse插件+gdb搭建go语言开发调试环境

windows下用eclipse+goclipse插件+gdb搭建go语言开发调试环境 目前go语言在window或者linux操作系统上,最好的go语言开发调试环境都是由eclipse+goc...
  • manlyboy1
  • manlyboy1
  • 2016年07月28日 10:27
  • 4254

GPS,UTC和本地时间的显示器

GPS,UTC和本地时间的显示器 GitHub仓库:https://github.com/XinLiGitHub/GpsUtcAndLocalTime PS:博文不再更新,后续更新会在GitHub仓库...
  • u012325601
  • u012325601
  • 2017年10月22日 18:43
  • 119

mysql的week函数与JAVA计算周的差别问题

1、问题: 在某些情况下,会需要将日期按周来进行排序或统计,mysql就要用到week()或yearWeek()函数,就会发现,比如2016年的某一天,在mysql里面是属于第30周,但在JAVA中使...
  • cwfreebird
  • cwfreebird
  • 2017年01月22日 15:06
  • 1218

【Effection C++】读书笔记 条款18~条款19

【Effective C++】Part4 设计与声明 条款18:让接口容易被正确使用,不易被误用 条款19:设计class犹如设计type...
  • xiazhiyiyun
  • xiazhiyiyun
  • 2017年05月18日 22:49
  • 120

App Store审核条款(2016.06.21更新)

App Store 审核条款
  • bb1223
  • bb1223
  • 2016年06月21日 14:33
  • 1712

条款06:若不想编译器自动生成的函数,就该明确拒绝

总结如下: 1.想要防止对象的拷贝,你可以将拷贝构造函数和赋值运算符重载函数声明为private,而且不实现他们,这样在对象试图拷贝的时候就会报出链接错误。 class A { public: A(...
  • IT_iverson
  • IT_iverson
  • 2017年11月13日 14:50
  • 104

【Android开发】范例3-"我同意"游戏条款

实现游戏开始界面中的我同意游戏条款功能:不勾选“我同意”复选框,就不会出现“开始游戏”的按钮,勾选“我同意”复选框,出现“开始游戏”的按钮。 效果图如图: 未点击"我同意"之前 点击“我同意”之...
  • u013517797
  • u013517797
  • 2015年04月03日 09:54
  • 1257
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Guru of the Week 条款19:自动转换
举报原因:
原因补充:

(最多只允许输入30个字)