C++中关键字 public 和 private
信息至少可以分两类:不介意别人知道的数据和保密的数据。对大多数人来说,性别就是一项不介意别人知道的信息,但收入可能属于隐私。
C++让您能够将类属性和方法声明为公有的,这意味着有了对象后就可获取它们;也可将其声明为私有的, 这意味着只能在类的内部(或其友元)中访问。 作为类的设计者, 您可使用 C++关键字 public 和 private 来指定哪些部分可从外部(如 main( ))访问,哪些部分不能。
对程序员来说,能够将属性或方法声明为私有的( private)有何优点呢?请看下述 Human 类的声明(忽略除成员属性 age 外的其他代码):
class Human
{
private:
// Private member data:
int age;
string name;
public:
int GetAge()
{
return age;
}
void SetAge(int humansAge)
{
age = humansAge;
}
// ...Other members and declarations
};
假设有一个名为 eve 的 Human 实例:
Human eve;
如果试图使用下述代码访问成员 age:
cout << eve.age; // compile error
将出现类似于这样的编译错误:“错误: Human::age—不能访问 Human 类声明的私有成员”。要访问 age,唯一的途径就是通过 Human 类的公有方法 GetAge()
,这个方法以编写 Human 类的程序员认为的合适方式暴露 age:
cout << eve.GetAge(); // OK
如果编写 Human 类的程序员愿意,可以让 GetAge()
显示的年龄比 Eve 的实际年龄小!换句话说,这意味着 C++允许类决定要暴露哪些属性以及如何暴露。如果 Human 类没有公有成员方法 GetAge()
,就可确保用户根本无从查询 age。在本章后面将介绍的情形下,这种功能很有用。
同样,也不能直接给 Human::age 赋值:
eve.age = 22; // compile error
要设置年龄,唯一的途径是通过 SetAge()
:
eve.SetAge(22); // OK
这有很多优点。当前,SetAge()
的实现只是直接设置成员变量 Human::age,但也可在 SetAge()
中验证外部输入,避免 age 被设置为零或负数:
class Human
{
private:
int age;
public:
void SetAge(int humansAge)
{
if (humansAge > 0)
age = humansAge;
}
};
总之, C++让类的设计者能够控制类属性的访问和操纵方式。
该文章会更新,欢迎大家批评指正。
推荐一个零声学院的C++服务器开发课程,个人觉得老师讲得不错,
分享给大家:Linux,Nginx,ZeroMQ,MySQL,Redis,
fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,
TCP/IP,协程,DPDK等技术内容
点击立即学习:C/C++后台高级服务器课程