gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 13:59:01 27 4
gpt4 key购买 nike

据说以下内容比将 First() 和 Second() 作为公共(public)成员更好。我相信这几乎一样糟糕。

// 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 {
public:
Couple() : deleted_(false) { }
void MarkDeleted() { deleted_ = true; }
bool IsDeleted() { return deleted_; }

private:
T first_;
U second_;
bool deleted_;
T& First() { return first_; }
U& Second() { return second_; }
};

如果您要提供一种方法来访问类之外的私有(private)变量,那有什么意义呢?功能不应该是

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

最佳答案

返回对类内部的引用(或指针)不好的原因有很多。从(我认为是)最重要的开始:

  1. 封装被破坏:你泄露了一个实现细节,这意味着你不能再随意改变你的类内部结构。例如,如果您决定不存储 first_ 而是动态计算它,您将如何返回对它的引用?你不能,因此你被卡住了。

  2. Invariant 不再可持续(在非常量引用的情况下):任何人都可以随意访问和修改引用的属性,因此您无法“监视”其更改。这意味着您不能维护该属性所属的不变量。从本质上讲,您的类(class)正在变成一个 blob。

  3. 生命周期 问题出现了:在它们所属的原始对象不复存在后,很容易保留指向该属性的引用或指针。这当然是未定义的行为。例如,大多数编译器会尝试警告有关在堆栈上保留对对象的引用,但我知道没有编译器能够为函数或方法返回的引用产生此类警告:您只能靠自己。

因此,通常最好不要放弃对属性的引用或指针。 甚至不是 const 的!

对于较小的值,通常通过复制(inout)传递它们就足够了,尤其是现在使用移动语义(在路上)。

对于较大的值,这确实取决于情况,有时代理可能会减轻您的麻烦。

最后,请注意,对于某些类,拥有公共(public)成员并不是那么糟糕。封装 pair 的成员有什么意义?当您发现自己编写的类不过是属性的集合(没有任何不变量)时,与其将所有的 OO 放在我们身上并为每个属性编写一个 getter/setter 对,不如考虑将它们公开。

关于c++ - 返回成员变量的引用是不好的做法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8005514/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com