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;
}

