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;
}
 
 
 
 
 
 
原文地址:https://www.cnblogs.com/Tempt/p/9987505.html