C++友元函数和友元类

C++友元函数和友元类

今天学到一个特别有意思的东西,甚至是C++独有的东西,叫做友元函数。类的友元函数是定义在类外部,但有权访问类的所有私有(private)成员和保护(protected)成员。尽管友元函数的原型有在类的定义中出现过,但是友元函数并不是成员函数。

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

如果要声明函数为一个类的友元,需要在类定义中该函数原型前使用关键字 friend。C++之所以特有友元函数,其实是别的面向对象语言换了个方法叫他,而不是说C++有这样一个新鲜的特性。可以对应到Java的private-package,C#的Internal等。

下面看例子:

如果我有这样一个类

class Pen{
    public:
    	Pen();
    private:
    	int _price = 1500;
};

我在主函数中

int main(){
    Pen pilot;
    cout << pilot._price << endl;
}

// 编译器会果断报错,因为没有权限访问Pen类的私有成员

那么如果有了今天的主角友元函数

class Pen{
  public:
      Pen();
  private:
      int _price = 1500;
      friend void printPrice(Pen pilot); // 在类内部需要声明
    
};

// 注意,友元函数不是类的成员函数
void printPrice(Pen pilot){
    cout << pilot._price << endl;
}


// 主函数
int main(){
    Pen pilot;
    printPrice(pilot);
    //  输出结果为 1500
    
    return 0;
}

友元类

友元类和友元函数一样,如果A是B的友元类,那么A的成员函数可以访问B的私有成员。

声明和定义

友元类的声明在需要被访问的类内部,而实现在类的外部。

friend class friendClassName;

实例

class beVisted{
  private:
    int _a;
  public:
    beVisted(int b):_b(b){};
    
    friend class friendClass;  // 在被访问的类中声明友元类
};

class friendClass{
  public: 
    int get_a(beVisted obj){
        return obj._a;  // 访问私有成员 _a
    }
    
};

友元关系不可以传递、继承、交换!

  • A是B的友元,B是C的友元, A不是C的友元;
  • A是B的友元,B不是A的友元;
  • A是B的友元,C是B的派生类,A不是C的友元。
posted @ 2020-02-11 21:49  scyq  阅读(350)  评论(0)    收藏  举报