【发布时间】:2015-12-11 01:53:00
【问题描述】:
对于 C++ 中的类:我不明白什么时候应该创建私有成员变量和函数, 我知道不能从 int main 调用它们,而公共成员可以,但我不知道何时应该将某些东西定义为私有以及有什么好处。
有人可以用示例代码解释使用私有成员的好处是什么以及它为什么有用吗? (它会阻止用户更改您编写的代码吗?这有什么用)?
【问题讨论】:
-
您可以作为驾驶员访问您的汽车引擎吗?这样想
对于 C++ 中的类:我不明白什么时候应该创建私有成员变量和函数, 我知道不能从 int main 调用它们,而公共成员可以,但我不知道何时应该将某些东西定义为私有以及有什么好处。
有人可以用示例代码解释使用私有成员的好处是什么以及它为什么有用吗? (它会阻止用户更改您编写的代码吗?这有什么用)?
【问题讨论】:
有比在堆栈溢出几分钟内输入的答案更好的资源,但简而言之:
公共成员 定义了您希望外界如何与您的班级互动。一般来说,最好的做法是不包含任何变量public,并让外部世界通过 Set/Get 函数与它们进行交互。
protected 和 private 都对外部世界隐藏成员,但也指定子类如何访问它们。 受保护的成员被继承; 私人成员不是。
从风格上讲,我倾向于将 protected 和 private 视为类的 public 接口使用的子例程。如果我做一个全是“形状”的类的集合,我把“square”、“circle”、“triangle”的public接口的公共代码分解出来,放在protected 基础“形状”类中的函数。我倾向于不经常使用private。 (主要是因为我从事嵌入式工作,我对类之间的代码共享更感兴趣,而不是接口封装,而且我的代码从未用作外部资源的库)
【讨论】:
Private 真的只是为了方便使用。例如,假设我正在制作一个游戏并且有一个角色类:
class character
{
private:
int level;
public:
character()
void setLevel(int newLevel);
};
这允许更改级别,但如果我希望有一个最大级别,我可以在 setLevel 函数中定义它。现在,如果有人想使用我的代码,他们无法制作 3,000,000 级的角色。他们只能使用最高级别。
我想我的观点是有助于保持变量在类中正常运行。该类可以定义它们如何更改等,而不是任何人都可以随心所欲地更改它们。
【讨论】:
private 是为了支持数据隐藏和封装的概念以及支持类之间的松散耦合。不过我可能是错的;我猜是为了方便使用。
我见过的两种思想流派是:
例子:
class A {
public:
A() : m_a(0) { }
int GetA() const { return m_a; }
int GetA() { return static_cast<const A&>(*this).GetA(); }
//...More code here
protected:
//I don't want external code to be able to modify m_a, only subclasses.
void SetA(int a) { m_a = a; }
//...More code here
private:
int m_a;
}
或者:
class A {
public:
A() : m_a(0) { }
int GetA() const { return m_a; }
int GetA() { return static_cast<const A&>(*this).GetA(); }
//...More code here
protected:
int m_a;
private:
}
【讨论】: