Re: [问题] 关于 return reference

楼主: xacid ( )   2014-05-20 15:30:02
: 推 wowslr:我想问一下,一般在设计 getter ,如果没有特别需要 const 05/19 22:30
: → wowslr:也都是提供const和non-const两个版本吗?或是有其他写法? 05/19 22:31
这个问题下面几位高手都有提出一些看法,
小弟也就顺着问题多说一些,如果离题请多包涵。
: 推 xacid:如果是回传ref/ptr to member,我都直接提供none-const 05/20 02:43
: → xacid:因为传出去就是为了方便而破坏封装,有没有const差不多 05/20 02:44
: 推 LPH66:相对的如果是以值回传的话则通常会挂 const 05/20 08:15
: → LPH66:(我是指 const member function) 这样方便使用 05/20 08:15
: → kingofsdtw:请问一下FOO是啥@@? 05/20 11:27
: → MOONRAKER:foo是电脑语言界的小明 foo()就是小明函数 05/20 11:33
: → Killercat:原来有人回了 我会建议提供两个getter 05/20 13:36
: → Killercat:这样要debug会有意想不到的妙用 05/20 13:37
: → uranusjr:以我个人而言, 不是“没有特别需要 const”就不加, 而是 05/20 14:06
: → uranusjr:相反, 如果可以的话尽量用 const & 或者直接传值, 除非必 05/20 14:06
: → uranusjr:要才会把 const 拿掉传 non-const 参考或 pointer 05/20 14:07
单独以原本的问题来说,回传 ref to member 以后,本尊还是在原本的 owner 里面。
那么最大的问题是,万一执行的时候本尊消失了,ref 就不能继续使用。
这是呼叫 getter 的 caller 要特别避免的,也是尽可能不要提供这种 getter 的原因。
如果设计还是需要提供 getter,那么 return type 有没有加 const 修饰,
是用来限制 caller 能否修改。以上面 IDrive 的例子来说,加上 const 就是
只能呼叫 IDrive 的 const member function。这可能不是很实际,
因为 IDrive 可能不是我写的,caller 可能也不是我写的,不能满足 const 条件。
或者未来改 code 真的需要改 IDrive... 这时候 const 就拔掉了。
当然一个好的设计不应该出现这种问题,比如 std::string::c_str() 也是 const
return const char* 也好好的。但是有时候不能为了一个新的 const 改一堆界面,
就会有牺牲。简单的 type 也比较容易加上 const,因为比较不会有 member function
也需要 const,造成 const 传染。
至于提供两个 getter,那只是 overloading,还是要先决定单独一个的情况,
才能说另外一个 getter 要作什么。

Links booklink

Contact Us: admin [ a t ] ucptt.com