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