- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我学习 C++ 已经有一段时间了,但是这个问题总是让我感到困惑(多年来)。在学校里,我们的讲师喜欢将类变量声明为私有(private)的。为了访问它,我们必须声明一个访问器来访问它。
有时我们甚至不得不让不同的类成为“ friend ”才能访问它的元素。
我的问题是:为什么搞得这么麻烦?当我们可以通过使用 public 来让我们作为程序员的生活更轻松时,所有私有(private)和 protected 东西背后的真正理由是什么?
我在想,一旦代码被编译,最终用户甚至不会区分我们在后端编码中使用公共(public)还是私有(private),那么为什么还需要将它正确声明为私有(private)、 protected ......等等?
最佳答案
使您的代码更易于理解和维护。
当你创建一个数据成员 public
,其他使用你的类的程序员自然会倾向于使用这些公共(public)成员,而不是一些提供相似或相同信息的成员函数,仅仅是因为它更容易。你甚至可能倾向于自己做这件事。这是可以理解的——程序员天生就是 lazy beasts .
但是假设您在某处意识到成员函数提供的信息不再仅从一个成员变量生成。更糟糕的是,如果该成员变量在面对设计更改时变得过时了怎么办。更糟糕的是,如果成员变量本身没有被删除,但它的语义发生了变化。
让我们考虑一个例子。假设您有一个代表您要出售的元素的类:
class Gizmo
{
public:
std::string mSku;
};
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/
由“CreateWindowEx(WS_EX_CLIENTEDGE, "EDIT", "", ES_MULTILINE.."创建的文本框需要\r\n 换行。我将我的 stdoutput 重定向到那个文
我是一名优秀的程序员,十分优秀!