c – 使用引用作为被视为错误编码风格的返回值?
我对这两种设置值的可能性提出了疑问:
假设我有一个我要改变的类的字符串.我用这个: void setfunc(std::string& st) { this->str = st; } 另一个函数能够完全相同,但是使用字符串引用而不是用于设置值的void: std::string& reffunc() { return this->str; } 现在,如果我要设置一个值,我可以使用: std::string text("mytext"); setfunc(text); //or reffunc() = text; 现在我的问题是,如果使用第二种形式设置值被认为是不好的. 解决方法
首先有getter和setter的原因是该类可以保护其不变量并且更容易修改.
如果您只有按值返回的setter和getter,那么您的类具有以下自由,而不会破坏API: >更改内部表示.也许字符串以不同的格式存储,更适合内部操作.也许它没有存储在类本身中. 如果更改getter以返回const引用,就像有时保存副本一样,则会失去一些表示自由.您现在需要一个可以引用的返回类型的实际对象,其寿命足够长.您需要为返回值添加生命周期保证,例如承诺在使用非const成员之前,引用不会失效.您仍然可以返回对不是该类的直接成员的对象的引用,但可能是成员的成员(例如,返回对内部名称struct的第一个名称部分的引用)或者是一个解除引用的指针. 但是如果你通过非const引用返回,几乎所有的赌注都会被取消.由于客户端可以更改引用的值,因此在值更改时,您不能再依赖于被调用的setter和由正在执行的类控制的代码.您无法约束该值,也无法保留不变量.通过非const引用返回使得该类与具有公共成员的简单结构略有不同. 这导致我们选择最后一个选项,只需将数据成员公开.与返回非const引用的getter相比,您唯一丢失的是返回的对象不再是间接成员;它必须是一个直接的,真实的成员. 另一方面,性能和代码开销.每个getter和setter都是要编写的附加代码,还有额外的错误机会(为一个成员复制粘贴一个getter / setter对,为另一个成员创建相同的内容,然后忘记更改其中的一个变量?).编译器可能会内联访问器,但如果没有,则会产生调用开销.如果按值返回类似字符串的内容,则必须复制它,这很昂贵. 这是一个权衡,但大多数时候,编写访问器更好,因为它为您提供了更好的封装和灵活性. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |