Re: [cpp] 请教一个函数的问题

liangml liangml at 6636.com
Tue Mar 7 14:43:27 CST 2006


"如果需要深拷贝,完全可以在函数内部进行"

其实这里只是提供了一个缺省的深拷贝,当然你也可以在函数内部做(注意,很少事情是"这个不可以"而只有"那个可以"的),
但关键是从函数的声明里我们就很容易看得出设计这个函数接口的意图. 
要么传值,要么传引用,我们能在接口里提示这一点是很重要的.如果你在函数内部做深拷贝,
阅读代码的人非得要看到你的实现代码才能知道:哦,原来这个CODER不想改变传入的OBJECT....

关键是我们需要坚持,不需对对象进行改变的函数接口使用const. 一般除了库,很少人能坚持这一点

当然,很多传引用的语言也工作得很好. 至于欣赏哪种,见仁见智了.
  ----- Original Message ----- 
  From: 卢立璵(bad_fish) 
  To: C++ Discuss Group 
  Sent: Tuesday, March 07, 2006 10:57 AM
  Subject: Re: [cpp] 请教一个函数的问题


  前提是 NODE 足够复杂。

  方法2没有 任何 存在的必要。
  非但要进行一次tmp的拷贝构造,并且需要完全暴露NODE的声明才可以。
  更加无法进行C调用
  如果需要对源NODE进行深拷贝,完全可以在函数内部进行,和方法2完全无关。
  总而言之方法2丑陋之极。

   
  On 3/7/06, liangml <liangml at 6636.com> wrote: 
    -----------------------应该说保留是有些必要的..................----------------------------

    63577982 07:59:20
    大家好。请假一个关于函数的问题。
    class NODE; //假设NODE是一个足够复杂的类

    void dosomething1( const NODE & node );
    void dosomething2( NODE node );
    我觉得,dosomething1明显比dosomething2的效率要高,因为省略了一个拷贝构造NODE类型的时间。
    那么,为什么还会存在dosomething2这种用法?其有什么比用法1好的地方呢? 
    在我现在看来,用法2可以做的地方,用法1都可以做,而且效率要高。
    本人愚昧,请大家指点一下。 

     63577982 08:40:11
    恩,我蛮困惑的。
    如果用法2没有用法1好的话,那C++函数里面为何要拷贝一份NODE呢?
    不知道这样有何意义。先下了,大家有知道的。麻烦告知一下。 

    果子 09:40:17
    保留
    void dosomething2( NODE node );
    应该是必须的吧 
    果子 09:40:50
    假设dosomething2和caller是一个异步的过程,caller发起调用后继续去对node做改变 
    果子 09:41:13
    这个时候dosomething2里面的node值也会跟着改变,这是caller所不希望的 
    果子 09:41:21 
    是一个副作用 
    果子 09:41:34
    所以第二种方法能够提供一个snapshot 
    果子 09:43:24
    还有,如果你传了const,那么类里面你要调用的方法必须也是const,而往往这个类要提供好多个方法是非const的给别的地方用 
     裕作 09:44:12
    Const的方法?还是说Static? 
    果子 09:45:58
    我是这个意思
     
    果子 09:46:07 
    class A
    {
    public:
     void b()
    };

    void AA(const A & a)
    {
     a.b();
    } 
    果子 09:46:23
    这种代码编译会失败.因为你传的是const A& 
    果子 09:46:33
    而你试图调用一个非const的member function 
    果子 09:46:44
    应该这样写:
    class A
    {
    public:
     void b() const;
    };

    void AA(const A & a)
    {
     a.b();
    } 
    果子 09:47:17
     void b() const;
    说明了b()无法改变A的member的值,也就是它使用的是
    const this 
    果子 09:47:57
    如果允许你调用void b()的话,那这个const A&就几乎没意义了.因为你能通过它的结构随便改变类里面的东西 



      ----- Original Message ----- 
      From: 千里马肝 
      To: C++ Discuss Group 
      Sent: Tuesday, March 07, 2006 9:40 AM
      Subject: 答复: [cpp] 请教一个函数的问题

       
      c++里应该再不会出现第二种形式了吧,个人认为其没有存在的价值
      即使想直接拿着参数进行操作,那也可以用第一种形式,然后在函数体内自行复制也是一样
      而第一种本质上等同于传了一个Pointer进去(可能由compiler自动转换)
        -----原始邮件-----
        发件人: cpp-bounces at codingnow.com [mailto: cpp-bounces at codingnow.com]代表 苏益ꪏ
        发送时间: 2006年3月7日 8:23
        收件人: cpp at codingnow.com
        主题: [cpp] 请教一个函数的问题


    大家好。请假一个关于函数的问题。

    //假设NODE是一个足够复杂的类
    class NODE; 
    void dosomething1( const NODE & node );
    void dosomething2( NODE node );

    我觉得,dosomething1明显比dosomething2的效率要高,因为省略了一个拷贝构造NODE类型的时间。 
    那么,为什么还会存在dosomething2这种用法?其有什么比用法1好的地方呢?
    在我现在看来,用法2可以做的地方,用法1都可以做,而且效率要高。

    本人愚昧,请大家指点一下。 





          =============================================== 
          快来和我一起享受TOM免费邮箱吧! 看看除了1.5G,还有什么? 

              敲开精彩 聊天世界: 网通用户 电信用户 


          明星送祝福(http://sr.tom.com): 周杰伦  蔡依林  王力宏  田震  代您送去生日祝福 


          万首金曲免费送(http://mm.tom.com/ivr/) : 你到底爱谁   千年之恋  我是真的爱你   一辈子做你的女孩 

          全部彩铃免费送( http://mm.tom.com/cailing/): 我发财了发财了  你喜欢我就说嘛  两只蝴蝶   冲动的惩罚 
          ===============================================  



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


    _______________________________________________
    Cpp mailing list
    Cpp at codingnow.com
    http://codingnow.com/mailman/listinfo/cpp




    _______________________________________________
    Cpp mailing list
    Cpp at codingnow.com
    http://codingnow.com/mailman/listinfo/cpp






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


  _______________________________________________
  Cpp mailing list
  Cpp at codingnow.com
  http://codingnow.com/mailman/listinfo/cpp
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://codingnow.com/pipermail/cpp/attachments/20060307/7b3ecfb3/attachment-0001.html


More information about the Cpp mailing list