C++成员权限及友元介绍

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_43946347/article/details/100638404

C++成员访问权限及友元介绍

对于C++类,可以定义三种不同访问控制权限的成员。这三种分别是public公有类型,private私有类型,protected保护类型。

  • public 具有这个访问控制权限的成员是完全公开的,即该成员不但可以被它所在类的成员函数及该类的友元函数访问,而且可以被和该类对象处于同一作用域的任何函数访问。
  • private 对类外完全保密,只能被它所在类中的成员函数和该类的友元函数访问
  • protected 只能被它所在类及该类派生的子类成员函数及友元函数访问

友元介绍

类可以允许其他函数或者类访问它的非公有成员,方法是令其成为友元

  • 友元的声明只能出现在类的内部,但是在类内出现的具体位置不限制友元函数不是类的成员,也不受所在区域访问控制级别的限制
  • 友元函数的定义可以在类内也可以在类外
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);
​
}

注意,友元函数访问一个类的私有成员和保护成员是通过对象来访问
友元关系注意:

  • A是B的友元,不代表B是A的友元
  • A是B的友元,B是C的友元,不代表A是C的友元

还可以令一个类作为本类的友元,也可以把另一个类的成员函数作为本类的友元
A中声明B为友元,表示B可以访问A 私有和保护成员

class Count
{
public:
    friend class CTime; //声明CTime为Count的友元类
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();
}

一个类指定另一个类为友元类,相当于友元类的成员函数都成为了友元函数,可以访问此类的所有成员。

当把另一个类的成员函数作为本类友元时,必须注意彼此依赖关系,按顺序声明定义

class Student;          //这里声明Student

//1.我们先定义Teacher类,其中声明clear函数
class Teacher
{
public:
    Teacher(){}
    int clear(Student obj);        
            //这里切记不能定义它,因为clear函数用到了Student类的对象
};

​//2.接下来定义Student类,其中包括对clear的友元声明
class Student
{
public:
    Student() :m_score(123){}
    friend int Teacher::clear(Student obj);
private:
    int m_score;
};

//3.定义clear,这时候才能使用Student成员
int Teacher::clear(Student obj){            
    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

猜你喜欢

转载自blog.csdn.net/weixin_43946347/article/details/100638404