ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

c – 返回成员变量的引用是不好的做法?

2019-09-26 20:08:26  阅读:238  来源: 互联网

标签:member-variables c reference


以下据说比公共成员有第一个/第二个更好.我相信这几乎一样糟糕.如果您正在提供一种方法来访问课外的私有变量,那么重点是什么?功能不应该是

T First(); void(or T) First(const T&)

样品:

// Example 17-3(b): Proper encapsulation, initially with inline accessors. Later
// in life, these might grow into nontrivial functions if needed; if not, then not.
//
template<class T, class U>
class Couple {
  Couple()           : deleted_(false) { }
  T& First()         { return first_; }
  U& Second()        { return second_; }
  void MarkDeleted() { deleted_ = true; }
  bool IsDeleted()   { return deleted_; }

private:
 T first_;
 U second_;
 bool deleted_;
};

解决方法:

将引用(或指针)返回到类的内部是不好的有几个原因.从(我认为是)最重要的开始:

>破坏了封装:泄漏实现细节,这意味着您无法再根据需要更改类内部.如果您决定不先存储first_,但要动态计算它,您将如何返回对它的引用?你不能,因此你被卡住了.
>不变性不再是可持续的(在非const引用的情况下):任何人都可以访问和修改随意引用的属性,因此您无法“监视”其更改.这意味着您无法维护此属性所属的不变量.从本质上讲,你的班级正在变成一个blob.
>生命周期问题涌现:在属性所在的原始对象不再存在之后,很容易保留属性的引用或指针.这当然是未定义的行为.例如,大多数编译器会尝试警告保持对堆栈上对象的引用,但我知道没有编译器能够为函数或方法返回的引用设置这样的警告:你是独立的.

因此,通常最好不要放弃引用或指向属性的指针.甚至不是常数!

对于较小的值,通常足以通过复制(in和out)传递它们,特别是现在使用移动语义(在路上).

对于较大的值,它实际上取决于具体情况,有时代理可能会减轻您的麻烦.

最后,请注意,对于某些课程,拥有公共成员并不是那么糟糕.封装成对的成员有什么意义?当你发现自己编写一个只是属性集合(没有任何不变量)的类时,那么不要让我们为所有OO编写所有OO并为它们编写getter / setter对,而是考虑将它们公之于众.

标签:member-variables,c,reference
来源: https://codeday.me/bug/20190926/1821449.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有