1. 程式人生 > >c/c++ 友元基本概念

c/c++ 友元基本概念

test names 能夠 ons fun c++ std 訪問類 color

友元基本概念:

1,把一個一般函數聲明為一個類的友元函數

2,把一個類A的某幾個成員函數聲明為某個類B的友元函數

3,把一個類A聲明為一個類B的友元類。

友元的作用:可以訪問類B裏所有的成員變量和成員方法,不管是public,protected,還是private。

1,把一個一般函數show聲明為一個類的友元函數

#include <iostream>
using namespace std;

class Test{
  friend void show(const Test &t);
public:
  Test(int d = 0) : data(d){}
private:
  void fun()const{
    cout << "fun:" << data << endl;
  }
  int data;
};

//友元,即可以訪問私有成員變量,也可以訪問私有方法                 
void show(const Test &t){
  cout << "friend of Test:" << t.data << endl;
  t.fun();
}

int main(){
  Test t(100);
  show(t);

  return 0;
}

2,把一個類A的fun成員函數聲明為類Test的友元函數,但是類A的fun1函數不是類Test的友元函數,所以在fun1裏不能夠訪問Test的私有成員。

#include <iostream>
using namespace std;

class Test;

class A{
 public:
  A(int d = 0) : data(d){}
  void fun(const Test &t);
  void fun1(const Test &t);

 private:
  int data;
};

class Test{
  friend void A::fun(const Test &t);
public:
  Test(int d = 10) : data(d){}
private:
  int data;
};

void A::fun(const Test &t){
  cout << t.data << endl;
}
void A::fun1(const Test &t){
  //編譯不能通過,因為fun1不是class Test的友元函數。               
  //cout << t.data <<endl;                                         
}
int main(){
  Test t(100);
  A a;
  a.fun(t);
}

3,把類B聲明為一個類Test的友元類,因此,類B的所有public成員函數都是類Test的友元函數。

#include <iostream>
using namespace std;

class Test;

class B{
public:
  void fun1(const Test &t);
  void fun2(const Test &t);
};

class Test{
  friend class B;
public:
  Test(int d = 0) : data(d){}
private:
  void pri()const{
    cout << "pri" << endl;
  }
  int data;
};

void B::fun1(const Test &t){
  cout << t.data << endl;
}
void B::fun2(const Test &t){
  t.pri();
}

int main(){
  Test t(10);
  B b;
  b.fun1(t);
  b.fun2(t);
}

c/c++ 友元基本概念