加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 使用引用作为被视为错误编码风格的返回值?

发布时间:2020-12-16 10:01:23 所属栏目:百科 来源:网络整理
导读:我对这两种设置值的可能性提出了疑问: 假设我有一个我要改变的类的字符串.我用这个: void setfunc(std::string st) { this-str = st; } 另一个函数能够完全相同,但是使用字符串引用而不是用于设置值的void: std::string reffunc() { return this-str; }
我对这两种设置值的可能性提出了疑问:

假设我有一个我要改变的类的字符串.我用这个:

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:

>更改内部表示.也许字符串以不同的格式存储,更适合内部操作.也许它没有存储在类本身中.
>验证传入值.字符串是否具有最大或最小长度? setter可以强制执行此操作.
>保留不变量.如果字符串发生变化,是否需要更改该类的第二个成员?设定者可以执行更改.也许字符串是一个URL,并且该类缓存了一些关于它的信息. setter可以清除缓存.

如果更改getter以返回const引用,就像有时保存副本一样,则会失去一些表示自由.您现在需要一个可以引用的返回类型的实际对象,其寿命足够长.您需要为返回值添加生命周期保证,例如承诺在使用非const成员之前,引用不会失效.您仍然可以返回对不是该类的直接成员的对象的引用,但可能是成员的成员(例如,返回对内部名称struct的第一个名称部分的引用)或者是一个解除引用的指针.

但是如果你通过非const引用返回,几乎所有的赌注都会被取消.由于客户端可以更改引用的值,因此在值更改时,您不能再依赖于被调用的setter和由正在执行的类控制的代码.您无法约束该值,也无法保留不变量.通过非const引用返回使得该类与具有公共成员的简单结构略有不同.

这导致我们选择最后一个选项,只需将数据成员公开.与返回非const引用的getter相比,您唯一丢失的是返回的对象不再是间接成员;它必须是一个直接的,真实的成员.

另一方面,性能和代码开销.每个getter和setter都是要编写的附加代码,还有额外的错误机会(为一个成员复制粘贴一个getter / setter对,为另一个成员创建相同的内容,然后忘记更改其中的一个变量?).编译器可能会内联访问器,但如果没有,则会产生调用开销.如果按值返回类似字符串的内容,则必须复制它,这很昂贵.

这是一个权衡,但大多数时候,编写访问器更好,因为它为您提供了更好的封装和灵活性.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读