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

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

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

MSN: fatalerror9999@hotmail.com

e-mail: kong_kong@163.com

最近评论
七星瓢企鹅:央视的新楼盖起来了,听说北京人照例给他起了个外号叫“大裤衩”
mopyman:严重鄙视此人
turingbook
简直是利欲熏心
psnccs:Wow gold
fdytxz:www.meinv880.cn
www.jipinjiading36.cn
terence zhao:感觉 读到现在,有时候感觉作者一直在作一个假设。然后我们在他们的假设中读书,不过思想还是不错的。
文章分类
收藏
    相册
    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 24: 当希望将 type conversions(类型转换)应用于所有 parameters(参数)时,请声明为 non-member functions(非成员函数)收藏

    新一篇: [翻译] Effective C++, 3rd Edition, Preface(前言) | 旧一篇: [翻译] Effective C++, 3rd Edition, Item 23: 用 non-member non-friend functions(非成员非友元函数)取代 member functions(成员函数)

    Item 24: 当希望将 type conversions(类型转换)应用于所有 parameters(参数)时,请声明为 non-member functions(非成员函数)

    作者:Scott Meyers

    译者:fatalerror99 (iTePub's Nirvana)

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

    在本书的 Introduction(导言)中我谈到让 classes 支持 implicit type conversions(隐式类型转换)通常是一个不好的主意。当然,这条规则有例外,最普通的一种就是在创建数值类型时。例如,如果你设计一个代表 rational numbers(有理数)的 class,允许从 integers(整数)到 rationals(有理数)的 implicit conversions(隐式转换)看上去没什么不合理的。这的确不比 C++ 的从 intdouble 的 built-in conversion(内建转换)更不合理(而且比 C++ 的从 doubleint 的 built-in conversion(内建转换)要合理得多)。在这种情况下,你可以用这种方式开始你的 Rational class:

    class Rational {
    public:
      Rational(int numerator = 0,        // ctor is deliberately not explicit;
               int denominator = 1);     // allows implicit int-to-Rational
                                         // conversions

      int numerator() const;             // accessors for numerator and
      int denominator() const;           // denominator — see
    Item 22

    private:
      ...
    };

    你知道你应该支持像加法,乘法这样的算术运算,但是你还不能确定是通过 member functions(成员函数),non-member functions(非成员函数),还是 non-member functions that are friends(非成员的友元函数)来实现它们。你的直觉告诉你,当你摇摆不定的时候,你应该坚持面向对象的原则。你了解这一点,于是断定,因为有理数的乘法与 Rational class 有关,所以在 Rational class 的内实现有理数的 operator* 似乎是自然而然的。但是,与直觉不符的是,Item 23 指出将函数放在它们所关联的 class 的内部的主张有时候与面向对象的原则正好相反,但是让我们将它先放到一边,来研究一下让 operator* 成为 Rational 的一个 member function(成员函数)的想法究竟怎么样:

    class Rational {
    public:
     ...

     const Rational operator*(const Rational& rhs) const;
    };

    (如果你不能确定为什么这个函数声明成它现在这个样子——返回一个 const by-value 的结果,却取得一个 reference-to-const 作为它的参数——请参考 Items 32021。)

    这个设计让你在有理数相乘时不费吹灰之力:

    Rational oneEighth(1, 8);
    Rational oneHalf(1, 2);

    Rational result = oneHalf * oneEighth;            // fine

    result = result * oneEighth;                      // fine

    但是你并不感到满意。你还希望支持 mixed-mode(混合模式)的运算,以便让 Rationals 能够和其它类型(例如,ints)相乘。毕竟,很少有事情像两个数相乘那么正常,即使它们碰巧是不同类型的数。

    然而,当你试着做混合模式的算术运算时,你发现它只有一半时间能够工作:

    result = oneHalf * 2;                             // fine

    result = 2 * oneHalf;                             // error!

    这是一个不好的征兆。乘法必须是可交换的,还记得吗?

    当你将最后两个例子重写为功能等价的另一种形式时,问题的来源就变得很明显了:

    result = oneHalf.operator*(2);                    // fine

    result = 2.operator*(oneHalf);                    // error!

    object oneHalf 是一个包含 operator* 的 class 的实例,所以编译器调用那个函数。然而,整数 2 与 class 没什么关系,因此没有 operator* member function(成员函数)。编译器还要寻找能如下调用的 non-member(非成员)的 operator*s(也就是说,在 namespace(名字空间)或全局范围内的):

    result = operator*(2, oneHalf);                   // error!

    但是在本例中,没有 non-member(非成员)的取得一个 int 和一个 Rationaloperator*,所以搜索失败。

    再看一眼那个成功的调用。你会发现它的第二个参数是整数 2,但是 Rational::operator* 却取得一个 Rational object 作为它的实参。这里发生了什么呢?为什么 2 在一个位置能工作,在其它地方却不行呢?

    发生的是 implicit type conversion(隐式类型转换)。编译器知道你传递一个 int 而那个函数需要一个 Rational,但是它们也知道通过使用你提供的 int 调用 Rational constructor(构造函数),它们能做出一个相配的 Rational,这就是它们的所作所为。换句话说,它们将那个调用或多或少地看成这个样子:

    const Rational temp(2);              // create a temporary
                                         // Rational object from 2

    result = oneHalf * temp;             // same as oneHalf.operator*(temp);

    当然,编译器这样做仅仅是因为提供了一个 non-explicit constructor(非显式构造函数)。如果 Rational constructor(构造函数)是 explicit(显式)的,这些语句都将无法编译:

    result = oneHalf * 2;                // error! (with explicit ctor);
                                         // can't convert 2 to Rational

    result = 2 * oneHalf;                // same error, same problem

    支持混合模式运算失败了,但是至少两个语句的行为将步调一致。

    然而,你的目标是既保持一致性又要支持混合模式运算,也就是说,一个能使上面两个语句都可以编译的设计。让我们返回这两个语句看一看,为什么即使 Rational 的 constructor(构造函数)不是 explicit(显式)的,也是一个可以编译而另一个不行:

    result = oneHalf * 2;                // fine (with non-explicit ctor)

    result = 2 * oneHalf;                // error! (even with non-explicit ctor)

    其原因在于只有当 parameters(形参)列在 parameter list(形参列表)中的时候,它们才有资格进行 implicit type conversion(隐式类型转换)。而对应于 member function(成员函数)被调用的那个 object 的 implicit parameter(隐含参数)—— this 所指的那个——根本没有资格进行 implicit conversions(隐式转换)。这就是为什么第一个调用能编译而第二个不能。第一种情况包含的一个parameter(形参)被列在 parameter list(形参列表)中,而第二种则没有。

    然而,你还是希望支持混合模式运算,现在做到这一点的方法或许很清楚了:让 operator* 成为一个 non-member function(非成员函数),这样就允许编译器将 implicit type conversions(隐式类型转换)应用于 all arguments(所有实参):

    class Rational {

      ...                                             // contains no operator*
    };
    const Rational operator*(const Rational& lhs,     // now a non-member
                             const Rational& rhs)     // function
    {
      return Rational(lhs.numerator() * rhs.numerator(),
                      lhs.denominator() * rhs.denominator());
    }
    Rational oneFourth(1, 4);
    Rational result;

    result = oneFourth * 2;                           // fine
    result = 2 * oneFourth;                           // hooray, it works!

    这样的确使故事有了一个圆满的结局,但是有一个吹毛求疵的毛病。operator* 应该不应该成为 Rational class 的 friend(友元)呢?

    在这种情况下,答案是不,因为根据 Rational 的 public interface(公有接口) operator* 能够完整地实现。上面的代码展示了做这件事一种方法。这导出了一条重要的结论:与一个 member function(成员函数)相对的是一个 non-member function(非成员函数),而不是一个 friend function(友元函数)。太多的 C++ 程序员以为如果一个函数与一个 class 有关而又不应该是一个 member(成员)时(比方说,因为所有的 arguments(实参)都需要 type conversions(类型转换)),它应该是一个 friend(友元)。这个示例证明这样的推理是有缺陷的。无论何时,只有你能避免 friend functions(友元函数),你就应该避免它,因为,就像在现实生活中,朋友的麻烦通常多于他们的价值。当然,有时友谊是必需的,但是事实表明仅仅因为函数不应该是一个 member(成员)并不自动意味着它应该是一个 friend(友元)。

    本 Item 包含真理,而且只有真理,但它还不是完整的真理。当你从 Object-Oriented C++ 穿过界线进入 Template C++(参见 Item 1)而且将 Rational 做成一个 class template(类模板)而不是一个 class 时,就有新的问题需要考虑,也有新的方法来解决它们,以及一些令人惊讶的设计关联性。这样的问题,解决方法和关联性是 Item 46 的主题。

    Things to Remember

    • 如果你需要在一个函数的所有 parameters(参数)(包括 this 所指的那个)上使用 type conversions(类型转换),这个函数必须是一个 non-member(非成员)。

     

    发表于 @ 2005年08月05日 01:22:00|评论(loading...)|编辑

    新一篇: [翻译] Effective C++, 3rd Edition, Preface(前言) | 旧一篇: [翻译] Effective C++, 3rd Edition, Item 23: 用 non-member non-friend functions(非成员非友元函数)取代 member functions(成员函数)

    评论

    #fatalerror99 发表于2006-01-26 07:27:00  IP: 211.100.21.*
    TrackBack来自《翻译:Effective C , 3rd Edition, Item 46: 当需要 type conversions(类型转换)时在 templates(模板)内定义 non-member functions(非成员函数)》

    Effective C , 3rd Edition, Chapter 7. Templates and Generic Programming, Item 46: Define non-member functions inside templates when type conversions are desired
    #Fires 发表于2005-08-05 13:38:00  IP: 61.186.252.*
    #过客 发表于2005-08-05 14:19:00  IP: 61.186.252.*
    Item 24 当需要将所有参数进行转换时,请使用非成员函数
    在本书的介绍中我提到了在通常情况下支持隐式类型转换的类其实并不好。当然这个规则有例外,特别是在创建数值类型的时候。例如,你设计了一个实数类,那么允许将一个整数隐式转换为实数并不是没有道理的事情。就像C++允许将内建数据类型int隐式转换为double一样(甚至将整数转换为实数的做法更合理一些)。基于这个考虑,你可能将实数类设计成这样:

    class Rational
    {
    public:
    Rational(int numerator = 0, // ctor is deliberately not explicit;
    int denominator = 1); // allows implicit int-to-Rational
    // conversions

    int numerator() const; // accessors for numerator and
    int denominator() const; // denominator — see Item 22

    private:
    ...
    };

    你知道你需要给这个类提供算术运算,例如加法和乘法,但是你也许不确定该使用哪种方式实现这些操作,是使用成员函数呢还是非成员函数,或者是使用非成员友元函数。你的直觉告诉你,当你犹豫不决的时候应该使用面向对象的方法来解决问题。你知道有理数的乘法与Rational类有关,所以选用成员函数实现operator*似乎是很自然的做法。但是Item 23指出使用成员函数违背了面向对象的原则。我们先不理会这个规则,看看如果使用成员函数实现operator*会怎么样:

    class Rational
    {
    public:
    // ...

    const Rational operator*(const Rational& rhs) const;
    };

    (如果你还不知道为什么这个函数将返回值声明为const by-value,并且接受一个const引用的话,请参考Item 3,20和21。)

    这个设计使你在进行有理数乘法时相当轻松:
    #过客 发表于2005-08-05 14:19:00  IP: 61.186.252.*
    Rational oneEighth(1, 8);
    Rational oneHalf(1, 2);

    Rational result = oneHalf * oneEighth; // fine
    result = result * oneEighth; // fine

    然而你还不满足,你当然希望int可以和Rational相乘,虽然两者属于不同的类型,但是它们之间的乘法运算是很自然的事情。

    当你进行这种混合模式的计算时,你将发现,这样做仅仅解决了一半的问题:

    result = oneHalf * 2; // fine
    result = 2 * oneHalf; // error!

    这是一个不好的征兆,记得吗,乘法应该满足交换率。

    如果以等价的形式重写上面两个运算,你就很容易发现问题的根源:

    result = oneHalf.operator*(2); // fine
    result = 2.operator*(oneHalf); // error!

    对象oneHalf是一个Rational实例,具有operator*操作的能力,但是整数2没有对应的类,所以也就没有能够完成与Rational对象相乘的operator*成员函数。编译器会查找所其他非成员的operator*函数(例如名字空间中或者全局作用域的operator*),并且尝试以下面的方式完成调用:

    result = operator*(2, oneHalf); // error!

    但是,在这个例子中并没有一个名为operator*的非成员函数可以接受int和Rational类型,所以尝试失败了。

    再看一下调用成功的那个语句,你发现第二个参数为整数2,但是Rational::operator*所接受的参数是Rational类型的,发生了什么事情呢?为什么2有时可以正常工作而有时却不能呢?

    答案是其间发生了隐式类型转换。编译器知道你将一个int传递给了需要Rational对象的函数,但同时编译器也知道它可以使用一个合适的Rational构造函数将这个int转换为一个Rational对象。也就是说,编译器将这个过程等价于下面的调用:

    const Rational temp(2); // create a temporary
    // Rational object from 2

    result = oneHalf * temp; // same as oneHalf.operator*(temp);

    但是,只有将构造函数声明为non-explicit时编译器才会这么做。如果Rational类的构造函数被声明为explicit,那么前面的两个混合模式的运算都不会通过编译:
    #过客 发表于2005-08-05 14:20:00  IP: 61.186.252.*
    result = oneHalf * 2; // error! (with explicit ctor);
    // can't convert 2 to Rational

    result = 2 * oneHalf; // same error, same problem

    虽然这会导致不支持混合模式的运算,但是至少两个语句的行为一致了(都不支持混合模式运算)。

    但是,你的目标是要支持混合模式的运算,也就是说你的设计应该使以上两个语句都通过编译。我们回到这两个语句,看一看为什么在Rational的构造函数是non-explicit的情况下,其中一个语句能通过编译而另一个不能:

    result = oneHalf * 2; // fine (with non-explicit ctor)
    result = 2 * oneHalf; // error! (even with non-explicit ctor)

    编译器只会尝试对函数参数列表中的对象进行隐式转换,而绝不会对成员函数所在的对象(this指针所指向的对象)进行隐式类型转换。在这个例子中由于*是左结合的,所以执行乘法运算时调用的是*左侧对象的operator*函数,也就是说编译器只会尝试对*号右侧的操作数进行隐式类型转换,而决不会对*号左侧的操作数进行隐式类型转换。所以对于第一个例子中编译器不会对oneHalf进行隐式类型转换,而会对2尝试进行隐式类型转换,在Rational提供non-explicit构造函数的情况下,隐式转换成功,通过编译。而在第二个语句中,由于编译器决不会对2进行隐式类型转换,从而因为没有任何函数可以完成int类型与Rational类型的乘法操作,所以这个语句将不会通过编译。

    但是,你还是想提供混合模式的算术运算。那么你就应该很清楚了——使用非成员函数来实现operator*,这样可以使得编译器对所有的操作数都可以尝试进行隐式类型转换:

    class Rational
    {
    ... // contains no operator*

    };

    const Rational operator*(const Rational& lhs, // now a non-member
    const Rational& rhs) // function
    {
    return Rational(lhs.numerator() * rhs.numerator(),
    lhs.denominator() * rhs.denominator());
    }


    Rational oneFourth(1, 4);
    Rational result;

    result = oneFourth * 2; // fine
    result = 2 * oneFourth; // hooray, it works!

    这当然是一个很完美的结局,然而我们还应该再考虑一点:应该让operator*成为Rational类的友元吗?
    #过客 发表于2005-08-05 14:20:00  IP: 61.186.252.*
    答案是:不!因为operator*完全可以通过调用Rational类的公用接口来实现。上面的示例代码就给出了这种方式。从而我们得出了一个重要的结论:与成员函数相对的是非成员函数而不是友元函数。太多的C++程序员认为如果一个函数与一个类有关却不能成为这个类的成员函数时(例如,需要对所有的参数进行隐式类型转换,就像上面的情况一样),那么应该让它成为这个类的友元。但是,这个例子说明了上述由是不充分的(因为我们完全可以使用现有的公有接口完成同样的操作)。只要能不使用友元就不要使用友元。正如在现实生活中,朋友给你带来的麻烦远比他们给你带来的帮助要多。当然,我们需要友谊,但这不是非成员函数成为友元函数的理由。

    这个Item中包含的除了真理还是真理,但是还不够完全,当你从OO C++转向Template C++(参考Item 1),并且不再将Rational实现为一个类而是一个模板时,你将面临新的问题,并且有解决问题的新方法,而且你会遇到令人惊讶的设计方案。Item 46讨论了这些问题。

    Things To Remember
     如果你需要对函数的所有参数进行隐式类型转换(包括被this指针指向的对象),必须将这个函数实现为非成员函数。
    #过客 发表于2005-08-05 10:35:00  IP: 61.186.252.*
    翻译的时候是不是可以自然一点呢?
    如果第二段翻译成这样是不是好些呢?
    你知道你需要给这个类提供算术运算,例如加法和乘法,但是你也许不确定该使用哪种方式实现这些操作,是使用成员函数呢还是非成员函数,或者是使用非成员友元函数。你的直觉告诉你,当你犹豫不决的时候应该使用面向对象的方法来解决问题。因为有理数的乘法与Rational类有关,所以选用成员函数实现operator*似乎是很自然的做法。但是Item 23指出使用成员函数违背了面向对象的原则。我们先不理会这个规则,看看如果使用成员函数实现operator*会怎么样:
    #fatalerror99 (iTePub's Nirvana) 发表于2005-08-07 11:05:00  IP: 61.186.252.*

    虽然不太同意过客网友关于翻译的主张,但本文有些地方的语言不太顺畅也是事实。对第二段稍微修改了一下,其它地方懒得动了。
    #fatalerror99 (iTePub's Nirvana) 发表于2005-08-07 11:11:00  IP: 61.186.252.*

    to 太乎公主:

    没想到我这个太变态太丧心病狂的家伙还能因为太变态太丧心病狂而成为少年儿童的“呕像”,看来是不枉此生了。
    #过客 发表于2005-08-08 09:48:00  IP: 61.186.252.*
    呵呵,本来就没有严格意义上的翻译,我们不是为翻译而翻译,而是应该尽量将问题讲明白。BTW,fatalerror99以前做过班长的吧^_^
    #fatalerror99 (iTePub's Nirvana) 发表于2005-08-08 12:46:00  IP: 61.186.252.*

    班长?
    好像还没做过这么大的官,不知此话从何说起?
    #fatalerror99 (iTePub's Nirvana) 发表于2005-08-05 20:20:00  IP: 61.186.252.*
    当英文原句翻译为中文无法理解时,可以调整语句的顺序,使其符合汉语习惯,易于国人理解。
    但我不赞成比较多地改变、增删原文使用的词汇,因为那样的话,只能说你的文章和作者的文章谈的是同一技术内容,而不是严格意义上的翻译。
    翻译应该在准确转译作者文章观点的基础上,尽量保持作者使用的词汇以及语言风格,而不是按照作者的思路,用你自己的语言再写一篇文章。
    我承认过客的文章比我翻译的文章更通顺,但他对原文的用语偏离比较大,个人认为这不是严格意义上的翻译。
    以上仅为个人观点,欢迎指正。
    #fatalerror99 (iTePub's Nirvana) 发表于2005-08-05 20:22:00  IP: 61.186.252.*
    比如标题中的 declare 原意为“声明”,翻译为“使用”,个人认为不妥。
    #七星瓢熊 发表于2005-08-05 21:18:00  IP: 61.186.252.*
    占位子呀占位子
    #某精灵 发表于2005-08-05 21:19:00  IP: 61.186.252.*
    这是佐藤叔叔的
    #sPhinX 发表于2005-08-08 14:18:00  IP: 61.186.252.*
    同意fatalerror99的看法,翻译的三重境界,首先是应该信的。
    #sPhinX 发表于2005-08-08 14:21:00  IP: 61.186.252.*
    “本来就没有严格意义上的翻译,我们不是为翻译而翻译,而是应该尽量将问题讲明白。”
    个人认为翻译就是为了翻译而翻译,记住这是别人的东西,而不是自己的东西,讲明白东西不是翻译本身的事情,如果值得翻译的话,那说明至少原文还是讲明白的一些事情的,如果没有讲明白问题的话,那还会值得翻译吗?
    #过客 发表于2005-08-08 14:53:00  IP: 61.186.252.*
    呵呵,在这里对翻译形式的争论实在没有太大的意义,我们都是想通过这本书更好的学习C++,其实从今年7月份开始,我就在和fatalerror99做着同样的事情,现在已经到了Item 29。我非常感谢fatalerror99的辛勤工作,使我们有一个交流的机会。问题不在于争论而在于学习,在翻译每一个Item的过程中,我都收获颇多。我将一如既往的完成每个Item,并且也将一如既往的关注这里。
    #太乎公主 发表于2005-08-05 22:53:00  IP: 61.186.252.*
    你太变态太丧心病狂了,我愿我有一天也成为你这样*^c^*
    #fatalerror99 (iTePub's Nirvana) 发表于2005-08-09 14:26:00  IP: 61.186.252.*

    谢谢楼上各位网友关注。
    最近工作比较忙,进度有些放缓,不过我会坚持下去,完成这项任务。
    #Nirvana 发表于2005-08-11 12:02:00  IP: 61.186.252.*
    嘿嘿,我并没有说你的内容不忠实于原文,而是使用的词汇和语言风格与原文有一些差别。
    #fatalerror99 (iTePub's Nirvana) 发表于2005-08-10 20:56:00  IP: 61.186.252.*
    根据他说的话,估计也是自己翻译的。
    #问问过客 发表于2005-08-10 15:16:00  IP: 61.186.252.*
    过客兄弟,你是出版社让你翻的,还是自己翻着练习的?
    #过客 发表于2005-08-11 08:57:00  IP: 61.186.252.*
    呵呵,当然是自己翻译的,也是抓紧利用业余时间完成的,现在完成到了Item 32。另外,我仔细对照了Item 24的原文,我只是在this指针那一段关于运算符的结合性问题上自己发挥了一下,其他是完全忠实于原著的绝对没有删改之处。
    #fatalerror99 发表于2006-01-20 21:45:00  IP: 211.94.229.*
    Item 24 改定
    #tiandejian 发表于2007-07-05 22:46:01  IP: 121.23.129.*
    强调终于原文,信,达,都做到了,
    可是过分的忠实便是愚忠,雅呢,
    翻译是再创作的过程,无论是文学作品还是专业文章。自己的风格还是要提倡的。保留过多原文的内容,文章就会显得支离破碎。并不是一个完整的作品。

    代码注释还是要翻译一下。
    #xuhb95083023 发表于2008-02-19 18:48:23  IP: 220.248.4.*
    this所指向的那个对象也需要隐式转换的情况是不是只有在重载运算符的时候才会出现呢?有没有其他例子?
    发表评论  


    登录
    Csdn Blog version 3.1a
    Copyright © fatalerror99