友元friend總結

來源:互聯網
上載者:User

1.關鍵字friend只出現在類定義的內部(這點與const不同)

2.友元是授予友元關係的那個類的成員

3.定義類B為類A的友元,B可以訪問A的私人成員

例1:/*要注意友元的使用順序,聲明B->定義A->定義B*/  class B;/*只聲明而未定義的類稱為不完全類,可用定義類型,不能用於定義對象*/  class A  {  private:      int x;  public:      A(int i):x(i){}      friend B;/*將B聲明為友元,B可以訪問A的private*/  };  class B  {  private:      int x;  public:      void Test(A a)      {          x = a.x;      }      int Get(){return x;}  };  int main()  {      A a(3);      B b;      b.Test(a);      //輸出3.說明Test()函數賦值成功,也說明Test()中的x是B的成員,從而得知,Test()是屬於B的       cout<<b.Get()<<endl;      return 0;  }  

4.定義類B的Test()函數為類A的友元,B的Test()函數可以訪問A的私人成員

例2:/*要注意友元的使用順序,聲明A->定義B(要作為友元的那個函數只聲明不定義)->定義A->定義B的函數*/class A;/*只聲明而未定義的類稱為不完全類,可用定義類型,不能用於定義對象*/class B{private:int x;public:void Test(A a);int Get(){return x;}};class A{private:int x;public:A(int i):x(i){}friend void B::Test(A a);/*將B的Test()聲明為友元,B的Test()可以訪問A的private*/};void B::Test(A a){x = a.x;}int main(){A a(3);B b;b.Test(a);//輸出3.說明Test()函數賦值成功,也說明Test()中的x是B的成員,從而得知,Test()是屬於B的cout<<b.Get()<<endl;return 0;}

5.友元聲明將已命名的類或非成員函數引入到外圍範圍中。此外,友元函數可以在類的內部定義,該函數的範圍擴充到包圍該類定義的範圍。

例3:

/*本來A和f()的範圍只限於在它們聲明之後。但是因為類B提前引入了它們,使得它們的範圍與類B的範圍相同*/class B{friend class A;friend void f();};class C{public:A *p;void g(){return f();}};class A;void f(){cout<<"1"<<endl;}int main(){C c;c.g();//輸入1return 0;}

6.友元函數的重載函數,如果要成為友元,必須要用friend聲明。

例4:

class A;/*只聲明而未定義的類稱為不完全類,可用定義類型,不能用於定義對象*/class B{private:int x;public:void Test(A a);void Test(A a1, A a2);void Test(A a1, A a2, A a3);int Get(){return x;}};class A{private:int x;public:A(int i):x(i){}friend void B::Test(A a);/*將B的Test()聲明為友元,B的Test()可以訪問A的private*/friend void B::Test(A a1, A a2);};//正確,因為已經被定義為友元void B::Test(A a){x = a.x;}//正確,因為已經被定義為友元void B::Test(A a1, A a2){x = a1.x + a2.x;}//錯誤,不能因為Test(A a)是友元,就認為它的重載也是友元void B::Test(A a1, A a2, A a3){x = a1.x + a2.x + a3.x;}

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.