精华内容
参与话题
问答
  • 友元

    2019-11-24 21:41:14
    这章主要是讲解C++中友元,其中友元包括友元函数与友元类。它的主要作用是可以访问类中已隐藏或者封闭的私有或者保护的数据成员或者函数。 关于友元其特性: (1) 友元关系不能被继承。 (2) 友元关系是单向的,不具有...

    序言

    这章主要是讲解C++中友元,其中友元包括友元函数与友元类。它的主要作用是可以访问类中已隐藏或者封闭的私有或者保护的数据成员或者函数。
    关于友元其特性:

    (1) 友元关系不能被继承。
    (2) 友元关系是单向的,不具有交换性。若类B是类A的友元,类A不一定是类B的友元,要看在类中是否有相应的声明。
    (3) 友元关系不具有传递性。若类B是类A的友元,类C是B的友元,类C不一定是类A的友元,同样要看类中是否有相应的申明

    友元函数

    1. 友元函数是独立于类的外部函数
    #include <QString>
    #include <QDebug>
    
    class Girl
    {
    public:
        Girl(QString name, int age);
        friend void showInfo(Girl&);
    private:
        QString m_name;
        int m_age;
    };
    
    void showInfo(Girl &girl);
    
    #include "girl.h"
    
    Girl::Girl(QString name, int age)
    {
        m_name = name;
        m_age = age;
    }
    
    void showInfo(Girl &girl)
    {
        qDebug() << " name = " << girl.m_name << " age = " << girl.m_age;
    }
    

    结果:
    在这里插入图片描述

    1. 友元函数为某个类中成员函数时
    
    #include <QString>
    #include <QDebug>
    #include "girl.h"
    class Boy
    {
    public:
        Boy(QString name, int age);
        friend void Girl::showInfo(Boy&); //girl中类成员函数作为友元函数
    private:
        QString m_name;
        int m_age;
    };
    
    
    Boy::Boy(QString name, int age)
        :m_age(age)
        ,m_name(name)
    {
    
    }
    
    #include <QString>
    #include <QDebug>
    class Boy;
    class Girl
    {
    public:
        Girl(QString name, int age);
        void showInfo(Boy&);
    private:
        QString m_name;
        int m_age;
    };
    
    
    #include "girl.h"
    #include "boy.h"
    Girl::Girl(QString name, int age)
        :m_age(age)
        ,m_name(name)
    {
    }
    
    void Girl::showInfo(Boy &boy)
    {
        qDebug() << " boy name = " << boy.m_name << " boy age = " << boy.m_age;
        qDebug() << " girl name = " << m_name << " girl age = " << m_age;
    }
    
    
     Girl girl("zhangsan", 12);
        Boy boy("lisi", 14);
        girl.showInfo(boy);
    

    结果图:
    在这里插入图片描述
    3. 把某个类作为另一个类的友元类

    #include <QString>
    #include <QDebug>
    class Boy;
    class Girl
    {
    public:
        Girl(QString name, int age);
        friend Boy;
    private:
        QString m_name;
        int m_age;
    };
    
    #include <QString>
    #include <QDebug>
    class Girl;
    class Boy
    {
    public:
        Boy(QString name, int age);
        void showInfo(Girl&);
    private:
        QString m_name;
        int m_age;
    };
    
    #include "boy.h"
    #include "girl.h"
    Boy::Boy(QString name, int age)
        :m_age(age)
        ,m_name(name)
    {
    
    }
    
    void Boy::showInfo(Girl & girl)
    {
        qDebug() << " girl name = " << girl.m_name << " girl age = " << girl.m_age;
    }
    
    
    
    Girl girl("zhangsan", 12);
        Boy boy("lisi", 14);
        boy.showInfo(girl);
    

    结果:
    在这里插入图片描述

    总结

    引入友元提高了程序的编程效率的同时在某些情况下他也破坏了类的封装性与隐蔽性。

    展开全文

空空如也

1 2 3 4 5 ... 20
收藏数 11,772
精华内容 4,708
关键字:

友元