错误ID:fatalerror99
212800次访问,排名314好友0人,关注者2
还好
fatalerror99的文章
原创 24 篇
翻译 80 篇
转载 5 篇
评论 384 篇
fatalerror99的公告
Copyleft © 2005 - 2008 by fatalerror99 (iTePub's Nirvana)

本 BLog 所有文章除注明转载者外,均为本人原创或翻译,欢迎转载。转载时请保持文章完整并注明出处。

强烈推荐使用 Mozilla Firefox 浏览本 BLog。

MSN: fatalerror9999@hotmail.com

e-mail: kong_kong@163.com

最近评论
fatalerror99:楼上说得对,原来的翻译确实错了,而且 object 应该都是单数,不是复数。
jjy:"每一件适用于 B objects(对象)的事情也适用于 D objects(对象),因为每一个 D objects 都 is-a(是一个)D objects(对象);" 应该是"因为每一个 D objects 都 is-a(是一个)B objects(对象);""
jjy:"一旦 derived class destructor(派生类析构函数)运行,这个 object(对象)的 derived class data members(派生类数据成员)就呈现为未定义的值,所以 C++ 就将它们视为不再存在。"
应该是base class destructor运行时...
七星瓢企鹅:央视的新楼盖起来了,听说北京人照例给他起了个外号叫“大裤衩”
mopyman:严重鄙视此人
turingbook
简直是利欲熏心
文章分类
收藏
    相册
    Effective C++, 3rd Edition 插图
    数学公式
    不服不行
    Bjarne Stroustrup
    Alexander A. Stepanov
    Andrei Alexandrescu
    Bruce Eckel
    Charles Petzold
    Chris Sells
    David R. Musser
    Dennis M. Ritchie
    Donald E. Knuth
    Herb Sutter
    James Gosling
    Nicolai M. Josuttis
    Scott Meyers
    Stanley B. Lippman
    侯捷
    荣耀
    精点 BLog
    水瓶水蓝
    水瓶水蓝 —— 晃荡在阴阳两界的魂儿
    (RSS)
    CityLife 的流水账(RSS)
    为艺术而技术(RSS)
    乱发当风(RSS)
    微起涟漪 —— basse(RSS)
    暗金色月亮的赫拉迪克宝盒(RSS)
    杏坛雨的博客(RSS)
    王晓渔:书中自有……(RSS)
    开发 BLog
    alai04 的专栏(RSS)
    C++ 的罗浮宫(RSS)
    Coofucoo's Blog--The Unadulterated Coofucoo(RSS)
    GreenCode's Blog(RSS)
    ilovevc 的专栏(RSS)
    lxwde 的专栏(RSS)
    oiramario(RSS)
    ralph623 的专栏(RSS)
    renco 的专栏(RSS)
    Scorpio Auding @ Blog++(RSS)
    SnowFalcon 的专栏(RSS)
    Stan Lippman's BLog(RSS)
    Sutter's (Online) Mill(RSS)
    切尔斯基(RSS)
    周星星 之 Blog(RSS)
    孟岩(RSS)
    开心就好的代码人生(RSS)
    心如止水 —— coofucoo 的专栏(RSS)
    方舟(RSS)
    歌谣在风中飘舞(RSS)
    空谷幽兰,心如皓月 —— 陈皓专栏(RSS)
    艺术编程(RSS)
    透明思考 - 1(RSS)
    透明思考 - 2(RSS)
    陈硕的 Blog(RSS)
    开发网站
    CSDN.NET
    artima devdloper: Best practices in enterprise software development
    Experts Exchange
    IBM DeveloperWorks
    IBM DeveloperWorks 中国(RSS)
    Programmers' Heaven
    The Artima Developer Community
    The Code Project
    卡卡社区
    开发语言与环境
    (CHEZ (CHEZ SCHEME))
    .NET Languages
    PHP: Hypertext Preprocessor
    Eclipse.org home
    Python Programming Language
    REBOL Technologies
    ActiveState
    D Programming Language
    Eclipse Plugins
    Eclipse Plusin Central
    Eiffel Software
    GCL - GNU Common Lisp
    GNU Compiler Collection (GCC)
    Groovy
    IronPython
    Perl
    Ruby on Rails
    Ruby Programming Language
    The Programming Language Lua
    坛子若干
    iTePub
    自由小店 —— iTePub 共建共享电子图书交互平台
    (RSS)
    ChinaJavaWorld.com 技术论坛
    ChinaUnix
    CSDN 技术社区 —— 这个不说大家也知道
    Huihoo - Open Source Community
    ITPUB 论坛
    卡卡社区
    网络书店
    Amazon.com
    China-Pub 网上书店
    joyo Amazon 卓越亚马逊
    第二书店
    有一杯咖啡叫做 Java
    Hibernate
    Java Technology
    JavaWorld
    jGuru
    Spring Framework
    The Apache Software Foundation
    TheServerSide.COM: Your Enterprise Java Community
    有一部经典叫做 C++
    Boost C++ Libraries
    C Programming and C++ Programming
    C/C++ Reference
    cplusplus.com
    Programming in C++, Rules and Recommendations
    The ADAPTIVE Communication Enviroment (ACE)
    The C Standards Committee (ISO C)
    The C++ Standard Committee (ISO C++)
    有一只企鹅叫做 Linux
    Debian
    Fedora Project
    Linux Journal
    Linux Online!
    Linux 伊甸园
    Linux.com
    Red Hat
    SUSE Linux Enterprise from Novell
    The Linux Foundation
    The Linux Kernel Archives
    Ubuntu
    有一种自由叫做开源
    OpenBSD
    CodeGuru
    FreeBSD
    FSF - The Free Software Foundation
    GNU
    Huihoo - Open Source Community
    Open Source Initiative (OSI)
    OpenSolaris
    SourceForge.net
    The Open Enterprise Foundation (OEF)
    专业出版机构
    Addison-Wesley
    APress
    Manning Publications Co.
    McGraw-Hill
    O'Reilly
    Prentice Hall PTR
    Wiley
    Wordware Publishing, Inc.
    Wrox
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    翻译 [翻译] Effective C++, 3rd Edition, Item 6: 如果你不想使用 compiler-generated functions(编译器生成函数),就明确拒绝收藏

    新一篇: [翻译] Effective C++, 3rd Edition, Item 7: 在 polymorphic base classes(多态基类)中将 destructors(析构函数)声明为 virtual(虚拟) | 旧一篇: [翻译] Effective C++, 3rd Edition, Item 5: 了解 C++ 为你偷偷地加上和调用了什么函数

    Item 6: 如果你不想使用 compiler-generated functions(编译器生成函数),就明确拒绝

    作者:Scott Meyers

    译者:fatalerror99 (iTePub's Nirvana)

    发布:http://blog.csdn.net/fatalerror99/

    房地产代理商出售房屋,服务于这样的代理商的软件系统自然要有一个 class(类)来表示被出售的房屋:

    class HomeForSale { ... };

    每一个房地产代理商都会很快指出,每一件房产都是独特的——没有两件是完全一样的。在这种情况下,为 HomeForSale object(对象)做一个 copy(拷贝)的想法就令人不解了。你怎么能拷贝一个独一无二的东西呢?因此最好让类似这种企图拷贝 HomeForSale object(对象)的行为不能通过编译:

    HomeForSale h1;

    HomeForSale h2;

    HomeForSale h3(h1);               // attempt to copy h1 — should
                                      // not compile!

    h1 = h2;                          // attempt to copy h2 — should
                                      // not compile!

    唉,防止这种编译的方法并非那么简单易懂。通常,如果你不希望一个 class(类)支持某种功能,你可以简单地不声明赋予它这种功能的函数。这个策略对于 copy constructor(拷贝构造函数)和 copy assignment operator(拷贝赋值运算符)不起作用,因为,就象 Item 5 中指出的,如果你不声明它们,而有人又想调用它们,编译器就会替你声明它们。

    这就限制了你。如果你不声明 copy constructor(拷贝构造函数)或 copy assignment operator(拷贝赋值运算符),编译器也可以替你生成它们。你的 class(类)还是会支持 copying(拷贝)。另一方面,如果你声明了这些函数,你的 class(类)依然会支持 copying(拷贝)。而我们此时的目的却是 prevent copying(防止拷贝)!

    解决这个问题的关键是所有的编译器生成的函数都是 public(公有)的。为了防止生成这些函数,你必须自己声明它们,但是你没有理由把它们声明为 public(公有)的。相反,应该将 copy constructor(拷贝构造函数)和 copy assignment operator(拷贝赋值运算符)声明为 private(私有)的。通过显式声明一个 member function(成员函数),可以防止编译器生成它自己的版本,而且将这个函数声明为 private(私有)的,可以防止别人调用它。

    通常,这个方案并不十分保险,因为 member(成员)和 friend functions(友元函数)还是能够调用你的 private 函数。换句话说,除非你十分聪明地不 define(定义)它们。那么,当有人不小心地调用了它们,在 link-time(连接时)会出现错误。这个窍门——声明 member functions(成员函数)为 private 却故意不去实现它——确实很好,在 C++ 的 iostreams 库里,就有几个类用此方法 prevent copying(防止拷贝)。比如,看一下你用的标准库的实现中 ios_basebasic_iossentry 的 definitions(定义),你就会看到 copy constructor(拷贝构造函数)和 copy assignment operator(拷贝赋值运算符)被声明为 private 而且没有被定义的情况。

    将这个窍门用到 HomeForSale 上,很简单:

    class HomeForSale {
    public:
      ...

    private:
      ...
      HomeForSale(const HomeForSale&);            // declarations only
      HomeForSale& operator=(const HomeForSale&);
    };

    你会注意到,我省略了 functions' parameters(函数参数)的名字。这不是必须的,只是一个普通的惯例。毕竟,函数不会被实现,更少会被用到,有什么必要指定参数名呢?

    对于上面的 class definition(类定义),编译器将阻止客户拷贝 HomeForSale objects(对象)的企图,如果你不小心在 member(成员)或 friend function(友元函数)中这样做了,连接程序会提出抗议。

    将 link-time error(连接时错误)提前到编译时间也是可行的(早发现错误毕竟比晚发现好),通过不在 HomeForSale 本身中声明 copy constructor(拷贝构造函数)和 copy assignment operator(拷贝赋值运算符)为 private,而是在一个为 prevent copying(防止拷贝)而特意设计的 base class(基类)中声明。这个 base class(基类)本身非常简单:

    class Uncopyable {
    protected:                                   // allow construction
      Uncopyable() {}                            // and destruction of
      ~Uncopyable() {}                           // derived objects...

    private:
      Uncopyable(const Uncopyable&);             // ...but prevent copying
      Uncopyable& operator=(const Uncopyable&);
    };

    为了阻止拷贝 HomeForSale objects(对象),我们现在必须让它从 Uncopyable 继承:

    class HomeForSale: private Uncopyable {      // class no longer
      ...                                        // declares copy ctor or
    };                                           // copy assign. operator

    这样做是因为,如果有人——甚至是 member(成员)或 friend function(友元函数)——试图拷贝一个 HomeForSale objects(对象),编译器将试图生成一个 copy constructor(拷贝构造函数)和一个 copy assignment operator(拷贝赋值运算符)。就象 Item 12 解释的,这些函数的 compiler-generated versions(编译器生成版)会试图调用 base class(基类)的相应函数,而这些调用将被拒绝,因为在 base class(基类)中,拷贝操作是 private(私有)的。

    Uncopyable 的实现和使用包含一些微妙之处,比如,从 Uncopyable 继承不必是 public(公有)的(参见 Item 3239),而且 Uncopyable 的 destructor(析构函数)不必是 virtual(虚拟)的(参见 Item 7)。因为 Uncopyable 不包含数据,所以它符合 Item 39 描述的 empty base class optimization(空基类优化)的条件,但因为它是 base class(基类),此项技术的应用不能引入 multiple inheritance(多继承)(参见 Item 40)。反过来说,multiple inheritance(多继承)有时会使 empty base class optimization(空基类优化)失效(还是参见 Item 39)。通常,你可以忽略这些微妙之处,而且仅仅像此处演示的这样来使用 Uncopyable,因为它的工作就像在做广告。你还可以使用在 Boost(参见 Item 55)中的一个可用版本。那个 class(类)名为 noncopyable。那是一个好东西,我只是发现那个名字有点儿 un-(不……)嗯…… nonnatural(非自然)。

    Things to Remember

    • 为了拒绝编译器自动提供的机能,将相应的 member functions(成员函数)声明为 private,而且不要给出 implementations(实现)。使用一个类似 Uncopyable 的 base class(基类)是方法之一。

    发表于 @ 2005年07月07日 23:46:00|评论(loading...)|编辑

    新一篇: [翻译] Effective C++, 3rd Edition, Item 7: 在 polymorphic base classes(多态基类)中将 destructors(析构函数)声明为 virtual(虚拟) | 旧一篇: [翻译] Effective C++, 3rd Edition, Item 5: 了解 C++ 为你偷偷地加上和调用了什么函数

    评论

    #fatalerror99 发表于2005-11-25 23:20:00  IP: 60.24.154.*
    Item 6 改定
    #fatalerror99 发表于2006-01-18 10:41:00  IP: 211.94.229.*
    据我所知,侯捷先生也在翻译这本书,而且大陆方面的出版社已经购买了版权,所以我这本就不会正式出版了。如果有可能,在全部翻译完成后,会提供一本chm格式的电子书。
    谢谢你的评价,我翻译时的标准就是尽量忠于原著。
    #fatalerror99 发表于2006-01-18 11:16:00  IP: 211.94.229.*
    如果不能超越作者,那就忠于原著。这是翻译者的基本职业道德。话说回来,如果有谁自认为能超越作者,哪它也许就不会翻译作者的书了,不如自己去写一本新书 :-)
    #blues_fdw 发表于2006-01-18 09:56:00  IP: 219.142.93.*
    看了3天了,^_^,真的很不错,比很多所谓的学院大牛翻译的好多了,支持楼主,有空联系出版车出书:),出了我会买的.虽然不是巨搞笑,也不是很儒雅,但是很准确,忠实于原著,没有歪曲,已经非常好了,赞一个.
    #blue_fdw 发表于2006-01-18 22:09:00  IP: 221.220.42.*
    是的,受限于中国环境,氛围以及以前的积累,注定中国不会在应用开发领域有原创的大师级的作品。所以最现实的选择是作一个优秀的译者,或者写一些深入潜出的作品(Head First Design Patterns之类)。优秀的译者其实中国没有几个,楼主已经很难得了;但是我更希望中国能有一些中国人自己写的Head First系列。不过不着急,我们慢慢来,
    #terence zhao 发表于2008-03-01 15:19:09  IP: 222.200.180.*
    刚刚开始看这本书的英文原版,很好,有些地方不是很明白。谢谢大哥
    发表评论  


    登录
    Csdn Blog version 3.1a
    Copyright © fatalerror99