gpt4 book ai didi

class - 为什么要将类(class)成员设为私有(private)?

转载 作者:行者123 更新时间:2023-12-04 22:31:07 24 4
gpt4 key购买 nike

我学习 C++ 已经有一段时间了,但是这个问题总是让我感到困惑(多年来)。在学校里,我们的讲师喜欢将类变量声明为私有(private)的。为了访问它,我们必须声明一个访问器来访问它。

有时我们甚至不得不让不同的类成为“ friend ”才能访问它的元素。

我的问题是:为什么搞得这么麻烦?当我们可以通过使用 public 来让我们作为程序员的生活更轻松时,所有私有(private)和 protected 东西背后的真正理由是什么?

我在想,一旦代码被编译,最终用户甚至不会区分我们在后端编码中使用公共(public)还是私有(private),那么为什么还需要将它正确声明为私有(private)、 protected ......等等?

最佳答案

使您的代码更易于理解和维护。

当你创建一个数据成员 public ,其他使用你的类的程序员自然会倾向于使用这些公共(public)成员,而不是一些提供相似或相同信息的成员函数,仅仅是因为它更容易。你甚至可能倾向于自己做这件事。这是可以理解的——程序员天生就是 lazy beasts .

但是假设您在某处意识到成员函数提供的信息不再仅从一个成员变量生成。更糟糕的是,如果该成员变量在面对设计更改时变得过时了怎么办。更糟糕的是,如果成员变量本身没有被删除,但它的语义发生了变化。

让我们考虑一个例子。假设您有一个代表您要出售的元素的类:

class Gizmo
{
public:
std::string mSku;
};

就是这样,你所拥有的只是一个sku。假设 mSku的内容只是产品编号,例如 "12345" .

你完成了你的代码,发布了它,生活就很美好。直到您的公司变得像亚马逊一样成功,现在您开始从多个供应商处获得相同的产品。您决定最好的做法是对 mSku 进行编码。以便它包含供应商信息以及产品编号。来自两个不同供应商的相同小部件可能具有非常不同的 sku: S:12345 , Z:12345 .

任何需要 mSku 的代码只是一个产品编号 现在坏了 ,并且都必须重新分解。在这个愚蠢的小例子中,它可能是一个问题。想象一个包含 100 万行代码的代码库——这并不罕见。您和您所有的同事可能都忘记了 mSku 的所有地方。正在使用。所有的代码都不会编译失败,所以编译器没有帮助——但是所有的代码都被破坏了。这是一个巨大的问题。

如果您不依赖 mSku,一开始会更好。完全没有,但提供了一个成员函数,该函数被约定返回产品编号。就像是:
class Sku
{
public:
std::string ProductNumber() const;
private:
std::string mSku;
};

现在您可以更改 mSku 的语义。所有你想要的。只要你重构 ProductNumber()确实返回产品编号,所有这 100 万行代码仍然可以编译并且仍然是正确的。

事实上,我通常会更进一步。我通常会在 class 中制作所有内容 private直到有特定的理由让它变成别的东西。即使那样,我也只会做到 protected除非我真的需要它是 public .

[Why can't we] just make our life as a programmer easier by using public for everything?



在一个大型代码库中,即使它只由一个人维护,从长远来看,你实际上可以通过制作大量这些东西来让你的生活更轻松 private从一开始。

关于class - 为什么要将类(class)成员设为私有(private)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24661886/

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