C++ public、protected 、 private 和 friend

修饰权限

  • public 所有均可访问;
  • private 类自己的成员函数友元访问,不能被类对象、子类访问;(封装概念)
  • protected 类自己、友元以及子类访问,不能被类对象访问;(继承概念)
  • friend 友元,别人是你的朋友,他可以访问我的东西。(但不是我可以访问他的东西)

struct和class

  • struct 缺省权限是 public, class 缺省权限是 private;
  • C++ 中,只有成员变量很简单数量少才可能使用 struct;一般使用 class;

继承/派生

  • 继承基类,在基类前省略 public 等时,默认是 protected 属性

  • public 继承:基类 public 成员,protected 成员,private 成员的访问属性在派生类中分别变成:public, protected, private;(不变)

  • protected 继承:基类 public 成员,protected 成员,private 成员的访问属性在派生类中分别变成:protected, protected, private;(public变protected)

  • private 继承:基类 public 成员,protected 成员,private 成员的访问属性在派生类中分别变成:private, private, private。(public和protected变private)

  • 派生类包含了基类所有成员以及新增的成员,同名的成员被隐藏起来,调用的时候只会调用派生类中的成员

int main(){
 
  B b(10);
  cout << b.a << endl;//基类和子类同名,从子类对象调用,默认调用子类的成员
  cout << b.A::a << endl;//调用B的基类A的同名成员
 
  system("pause");
  return 0;
}

友元关系

友元

​ 类的友元函数是定义在类外部,但有权访问类的所有私有(private)成员和保护(protected)成员。尽管友元函数的原型有在类的定义中出现过,但是友元函数并不是成员函数。

​ 友元可以是一个函数,该函数被称为友元函数;友元也可以是一个类,该类被称为友元类,在这种情况下,整个类及其所有成员都是友元。

友元函数声明和定义

  • 要声明函数为一个类的友元,需要在类定义中该函数原型前使用关键字 friend
  • 声明类 ClassTwo 的所有成员函数作为类 ClassOne 的友元,需要在类 ClassOne 的定义中放置如下声明:friend class ClassTwo;
class INTEGER
{
    friend void Print(const INTEGER& obj);//声明友元函数
};

    // 请注意:print() 不是任何类的成员函数,函数名前不加类声明符
void Print(const INTEGER& obj)
{
    //函数体
}
void main()
{
    INTEGER obj;
    Print(obj);//直接调用
}

特点

  • 友元关系不能被继承
  • 友元关系是单向的,不具有交换性。若类 B 是类 A 的友元,类 A 不一定是类 B 的友元,要看在类中是否有相应的声明;
  • 友元关系不具有传递性。若类 B 是类 A 的友元,类 C 是 B 的友元,类 C 不一定是类 A 的友元,同样要看类中是否有相应的申明;
  • 友元函数并不是类的成员函数,因此在类外定义的时候不能加上 class::function name;

参考

1.深入理解 C++ 中 public、protected 及 private 用法

2.C++ public、protected 、 private 和 friend(最通俗易懂)

你可能感兴趣的:(C++ public、protected 、 private 和 friend)