众所周知,C++中有3种访问符,分别是private、public、protected。
其中private和public比较好理解。
private: 只能由该类中的函数、其友元函数访问,不能被任何其他访问,更不能由该类的对象在类外进行访问,类成员变量一般修饰为private,防止类使用者不受约束地直接修改数据。
public: 可以被该类中的函数、子类的函数、其友元函数访问,也可以由该类的对象在类外访问。需要提供给外部使用者的成员函数一般修饰为public,这样外部使用者可以通过对象来进行调用。某些成员函数有时候也修饰为private,方便类的编写者在编写其它成员函数需要实现某些稍微复杂的功能时去调用它,而它是无需被外部使用者所了解的,因此这样的成员函数被修饰为private。
protected:可以被该类中的函数、子类的函数、以及其友元函数访问,但是不能由该类对象在类外进行访问。
那么问题来了,protected在什么情况下使用呢?
说到protected,就不得不提到C++面向对象的一大特性:继承。如果没有继承这个机制,也就没有protected存在的意义。
需要继承给子类去调用的函数我们通常将其修饰为protected,子类的成员函数在实现自己功能的时候,可能会使用到父类修饰的成员函数。那么在继承的时候,父类的成员函数会提供给自己的子类,而这样的成员函数是不需要由外部使用者知道的,前面说过不需要由外部使用者知道的成员函数我们封装为private,但是由于要继承给子类,private函数继承给子类之后,其访问权限就变成不可访问了,而如果将这样的函数封装为protected,继承给子类之后,只要不是私有继承,其访问权限依然是protected,这样父类protected成员函数继承给子类后,子类就可以访问了,而且protected函数不能由对象在类外调用,保持了类对外接口的简洁性,即只将类的基本功能通过public成员函数作为接口提供给外部使用者去使用。
为什么不直接把这样的成员用public修饰呢?
正如前面所说,用protected修饰成员函数可以保持类对外使用的简洁性。
这里我们可以做一个总结:类只需要把自己的基本功能通过public成员函数作为接口提供给外部使用者。而不需要提供给外部使用者的函数,我们根据情况来设定它的访问限定符。如果仅仅只是本类成员函数要去调用的函数,我们可以封装为private,如果该函数需要继承给子类去调用,那么就将其封装为protected。这样做可以保持类对外使用的简洁性。
友元还有一个值得注意得地方,上面所说的友元函数包括两种:设为友元的全局函数,设为友元类中的成员函数。
学习链接:https://blog.csdn.net/weixin_44049823/article/details/128865866