C++友元函數,友元類


1. 友元的 聲明只能出現在類的內部,但是在類內出現的具體位置不限制,友元函數不是類的成員
也不受所在區域訪問控制級別的限值
2. 友元函數的 定義可以在類內也可以在類外
3. 友元函數它不是成員函數,它不受作用域的限值,不屬於類,也不屬於對象, 他就是一個普通的函數
 
友元函數使用典型錯誤:
 
<wiz_code_mirror>
 
 
 
 
class Count
{
public:
 Count():a(10){};
 friend void fn1(Count obj); //聲明友元函數
private:
 int a;
};
//定義友元函數
void fn1(Count obj)
{
 //cout << a << endl //這里是錯誤的!訪問私有成員應該是對象訪問!友元函數上面說過是普通函數
      //所以這里需要傳入一個對象參數,來訪問Count類中的私有成員!
 cout << obj.a << endl;
}
int main(){
 Count obj1;
 fn1(obj1);
}
 
 
 
友元類注意:
例如
1. A 是   B的友元,不代表 B 就是 A的友元    
2. A 是 B的友元, B是C的友元, 不代表 A就是C的友元
友元類例子:
 
<wiz_code_mirror>
 
 
 
 
 
class Count
{
public:
 Count():a(10){};
 friend class CTime; //聲明CTime為友元類
private:
 int a;
};
class CTime
{
public:
 void fn1(){
  for (int i = 0; i < 20;i++)
  {
   obj[i].a = i;
  }
 }
 void fn2(){
  for (int i = 0; i < 20;i++)
  {
   printf("%d\n", obj[i].a);
  }
 }
private:
 Count obj[20]; //定義20個Count對象
};
int main(){
 CTime cls;
 cls.fn1();
 cls.fn2();
}
 
 
 
令一個類中單個成員函數作為另一個類中的友元函數
需要嚴格把控代碼順序:
 
<wiz_code_mirror>
 
 
class Student;       //這里聲明Student
class Teacher
{
public:
 Teacher(){}
 int clear(Student obj);    //1.我們先定義Teacher類,其中聲明clear函數
          //這里切記不能定義它
};
class Student
{
public:
 Student() :m_score(123){}
 friend int Teacher::clear(Student obj);//2.接下來定義Student類,其中包括對clear的友元聲明
private:
 int m_score;
};
int Teacher::clear(Student obj){   //3.定義clear,這時候才能使用Student成員
 return obj.m_score;
}
int _tmain(int argc, _TCHAR* argv[])
{
 Student obj1;
 Teacher obj2;
 cout << obj2.clear(obj1) << endl;
 return 0;
}
 
 
 
 
 
 


免責聲明!

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



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