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

翻译文档 专栏收录该内容
74 篇文章 0 订阅

GotW #19 Automatic Conversions

著者: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*。下面的代码体现出两者的区别:

    string s1("hello"), s2("world");
   
    strcmp( s1, s2 );                // #1 (错误)
   
    strcmp( s1.c_str(), s2.c_str() ) // #2 (ok)
   

如果能做到#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转换构造函数时所遇到的问题是一样的。你将会很容易的写出看上去正确而实际上不正确的代码,这些代码原则上应该导致失败,但却可能由于古灵精怪的巧合而被编译通过并完成了与预期完全不同的操作。

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

    string s1, s2, s3;
   
    s1 = s2 - s3;   // 欧噢,或许原本是想要"+"
   

其中的减法毫无意义,应该是错误的。然而,如果存在从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

(完)

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

打赏
文章很值,打赏犒劳作者一下
相关推荐
<p> <span style="font-size:14px;color:#337FE5;">【为什么学爬虫?】</span> </p> <p> <span style="font-size:14px;">       1、爬虫入手容易,但是深入较难,如何写出高效率的爬虫,如何写出灵活性高可扩展的爬虫都是一项技术活。另外在爬虫过程中,经常容易遇到被反爬虫,比如字体反爬、IP识别、验证码等,如何层层攻克难点拿到想要的数据,这门课程,你都能学到!</span> </p> <p> <span style="font-size:14px;">       2、如果是作为一个其他行业的开发者,比如app开发,web开发,学习爬虫能让你加强对技术的认知,能够开发出更加安全的软件和网站</span> </p> <p> <br /> </p> <span style="font-size:14px;color:#337FE5;">【课程设计】</span> <p class="ql-long-10663260"> <span> </span> </p> <p class="ql-long-26664262" style="font-size:11pt;color:#494949;"> 一个完整的爬虫程序,无论大小,总体来说可以分成三个步骤,分别是: </p> <ol> <li class="" style="font-size:11pt;color:#494949;"> 网络请求:模拟浏览器的行为从网上抓取数据。 </li> <li class="" style="font-size:11pt;color:#494949;"> 数据解析:将请求下来的数据进行过滤,提取我们想要的数据。 </li> <li class="" style="font-size:11pt;color:#494949;"> 数据存储:将提取到的数据存储到硬盘或者内存中。比如用mysql数据库或者redis等。 </li> </ol> <p class="ql-long-26664262" style="font-size:11pt;color:#494949;"> 那么本课程也是按照这几个步骤循序渐进的进行讲解,带领学生完整的掌握每个步骤的技术。另外,因为爬虫的多样性,在爬取的过程中可能会发生被反爬、效率低下等。因此我们又增加了两个章节用来提高爬虫程序的灵活性,分别是: </p> <ol> <li class="" style="font-size:11pt;color:#494949;"> 爬虫进阶:包括IP代理,多线程爬虫,图形验证码识别、JS加密解密、动态网页爬虫、字体反爬识别等。 </li> <li class="" style="font-size:11pt;color:#494949;"> Scrapy和分布式爬虫:Scrapy框架、Scrapy-redis组件、分布式爬虫等。 </li> </ol> <p class="ql-long-26664262" style="font-size:11pt;color:#494949;"> 通过爬虫进阶的知识点我们能应付大量的反爬网站,而Scrapy框架作为一个专业的爬虫框架,使用他可以快速提高我们编写爬虫程序的效率和速度。另外如果一台机器不能满足你的需求,我们可以用分布式爬虫让多台机器帮助你快速爬取数据。 </p> <p style="font-size:11pt;color:#494949;">   </p> <p class="ql-long-26664262" style="font-size:11pt;color:#494949;"> 从基础爬虫到商业化应用爬虫,本套课程满足您的所有需求! </p> <p class="ql-long-26664262" style="font-size:11pt;color:#494949;"> <br /> </p> <p> <br /> </p> <p> <span style="font-size:14px;background-color:#FFFFFF;color:#337FE5;">【课程服务】</span> </p> <p> <span style="font-size:14px;">专属付费社群+定期答疑</span> </p> <p> <br /> </p> <p class="ql-long-24357476"> <span style="font-size:16px;"><br /> </span> </p> <p> <br /> </p> <p class="ql-long-24357476"> <span style="font-size:16px;"></span> </p>
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页

打赏

kingofark

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值