zoukankan      html  css  js  c++  java
  • 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;
    }
     
     
     
     
     
     
  • 相关阅读:
    python保护变量(_),私有变量(__),私有方法,
    避免在循环体中创建对象
    HashMap的初始容量(initialCapacity)和装载因子(loadFactor)
    深入理解Java的接口和抽象类
    关于◎SuppressWarnings("unchecked")
    缓存技术PK:选择Memcached还是Redis?
    Maven详解之聚合与继承
    浅谈redis和memcached的区别
    《玩转Spring》第二章 BeanPostProcessor扩展
    使用Spring实现读写分离( MySQL实现主从复制)
  • 原文地址:https://www.cnblogs.com/Tempt/p/9987505.html
Copyright © 2011-2022 走看看