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

李慧霸 magazine.lihuiba at 163.com
Tue Mar 7 16:50:31 CST 2006


这个问题除了性能考虑外,还有语言设计方面的考虑。如果我设计语言,我一定会在传引用和传值之间确定一个缺省方式,或主导方式,不会对有些东西缺省传值,有些东西缺省传引用,这样只能增加混乱(vb缺省就一律传引用,包括int之类的东西)。在设计c++的那个历史时代,我也会选择传值作为缺省,因为和c兼容,并且高效。于是这20年来都是这样的,不能变。

现在批判是不对的,就像批判岳飞维护封建王朝一样。

------------------				 
李慧霸
2006-03-07

-------------------------------------------------------------
发件人:卢立璵(bad_fish)
发送日期:2006-03-07 10:57:19
收件人:
抄送:
主题: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:* 千里马肝 <oiramario at gmail.com>
> *To:* C++ Discuss Group <cpp at codingnow.com>
> *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://bjcgi.163.net/cgi-bin/newreg.cgi?rf=050602>
>
> <http://vip.tom.com/info/ggd_050409/index.html>    敲开精彩 聊天世界<http://chat.tom.com/>
> :网通用户 <http://chat.tom.com/> 电信用户 <http://schat.tom.com/>
>
> 明星送祝福(http://sr.tom.com): 周杰伦 <http://sr.tom.com/send.php?id=330&type=2>
> 蔡依林 <http://sr.tom.com/send.php?id=315&type=2>  王力宏<http://sr.tom.com/send.php?id=257&type=2>
> 田震 <http://sr.tom.com/send.php?id=247&type=2>  代您送去生日祝福
>
>
> 万首金曲免费送(http://mm.tom.com/ivr/) : 你到底爱谁
> <http://fs.tom.com/sms/ivr_song_step0.php?var=1&id=37987&user_id=3&code_id=iw4001&>
> 千年之恋<http://fs.tom.com/sms/ivr_song_step0.php?var=1&id=38205&user_id=3&code_id=iw4001&>
> 我是真的爱你
> <http://fs.tom.com/sms/ivr_song_step0.php?var=1&id=37938&user_id=3&code_id=is0001&>
> 一辈子做你的女孩
> <http://fs.tom.com/sms/ivr_song_step0.php?var=1&id=1431&user_id=3&code_id=iw4001&>
>
> 全部彩铃免费送(http://mm.tom.com/cailing/): 我发财了发财了<http://fs.tom.com/sms/cailing_step0.php?var=1&id=462&songtype=1&user_id=3&code_id=000000&songprovince=甘肃&>
> 你喜欢我就说嘛<http://fs.tom.com/sms/cailing_step0.php?var=1&id=300&songtype=1&user_id=3&code_id=000000&songprovince=北京&>
> 两只蝴蝶
> <http://fs.tom.com/sms/cailing_step0.php?var=1&id=1345&songtype=0&user_id=3&code_id=&songprovince=北京&>
> 冲动的惩罚
> <http://fs.tom.com/sms/cailing_step0.php?var=1&id=376&songtype=0&user_id=3&code_id=&songprovince=北京&>
> ===============================================
>
>  ------------------------------
>
> _______________________________________________
> 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



More information about the Cpp mailing list