c++ 中的友元函數的普通用法


   C++中友元函數的調用,一般分為三種方式:

1、一般的友元函數

2、類A作為類B的友元類,則類A的成員函數都是類B的友元函數。

3、一個類的成員函數作為另外一個類的友元函數

 //分為友元函數的例子

類A 作為測試的類,類B 是類A的友元類。
class A
{
public:
 A()
 {
  a = 100;
  b = 10;
 }
 friend class B; //這兒公私均可,常常用到的是變為私有變量,類B是類A的友元類。友元的第二種方式,需要帶class
 int getA()
 {
  return a;
 }
 void printAB()
 {
  cout<<"a"<<a<<" b"<<b<<endl;
 }

 friend void setA(A *p, int _a); //友元函數的定義,friend 放在前面,記得友元函數的是將friend 放在函數的前面 ,友元函數的第一種方式

protected:

private:  

int a;  

int b;  

static int module;

};

 

int A::module = 10;
class B
{
public:
 void setA(A *p, int _a);
 void displayA(A *p)
 {
  cout<<p->a<<"ddddd"<<endl;
 }
protected:
 
private:
};
//友元類的類的成員函數都是友元函數 第二種方式
void B:: setA( A *p, int _a)
{
 p->a = _a + 100;
 p->b = _a + 100;
}

 

//普通的友元函數  第一種方式的具體實現

void setA(A *p, int _a)

{  

  p->a = _a;

  p->b = _a;

 }

用類girl 和類boy來舉例,既有boy 作為girl的友元類,又有boy的成員函數是girl的友元函數,這兩種形式。 

class girl;
class boy
{
public:
 void display_girl(girl &x); //普通成員的函數的定義沒有改變
 //{
 // cout<<"girl-name"<<x.name<<"age"<<x.age<<endl;
 //}
};

 class girl
{
public: //當初這個沒有寫pulic 導致出現錯誤
girl()
 {
  name = NULL;
  name = new char[10];
  if( NULL !=name)
  {
   strcpy(name,"fal");
  }
  age = 26;
 }

 

 ~girl()
 {
  if( NULL != name){
   //free(name);
   delete [] name;
  }
  
 }
private:
 char *name;
 int age;
 //friend class boy; //當初寫代碼的時候沒有寫class, 這是一個錯誤 ,友元的第二這種方式
 friend void  boy::display_girl(girl &x); //允許某一個類的成員函數訪問  第3種方式
};

 

友元函數的具體實現過程:

void boy::display_girl(girl &x)
{
 cout<<"girl-name:"<<x.name<<"\t age:"<<x.age<<endl;
}

主函數,
int main(void)
{
 A testa;
 B testB;
 girl fal;
 boy zjl;
 zjl.display_girl(fal);
 testB.setA(&testa, 10);
 cout<<"aa"<<testa.getA()<<endl;
 setA(&testa, 6);
 cout<<"bb"<<testa.getA()<<endl;
 return 0;
}

備注:learnCpluseplus/FunctionAndReload/dm03_friendly.cpp

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM