zoukankan      html  css  js  c++  java
  • C++中的“友元”

    经过一番学习,我知道类中有公有部分和私有部分。关于公有部分,我们是可以在类外进行访问的。但是私有部分却只有在类中才可以进行访问。但是想在类外访问私有部分成员也不是没有办法,那就是——友元(friend)。友元的最大作用也就是——在类外访问类中的私有成员。

    友元主要包括两个:友元函数和友元类

    #include<iostream>
    using namespace std;
    
    class Time
    {
    public:
        Time(int, int, int);              //声明构造函数;
        friend void display(Time &);          //声明友元成员函数display(),其中的Time是声明与Time类关联;
    
    private:
        int hour;
        int minute;
        int sec;
    };
    
    Time::Time(int h, int m, int s)            //定义构造函数,给hour、minute、sec赋初值;(初始化)
    {
        hour = h;
        minute = m;
        sec = s;
    }
    
    void display(Time &t)                  //注意,这里多了个‘t’,这个形参t是Time类对象的引用。
    {
        cout << t.hour << ":" << t.minute << ":" << t.sec << endl;
    }
    
    int main()
    {
        Time t1(10, 13, 16);                //这里定义一个Time类的t1,并且赋值为hour=10、minute=13,sec=16.
        display(t1);                      //这里调用display函数,并将实参t1的值带入形参t。
        return 0;
    }

    上述例子是将一个普通函数声明为友元函数,这其实和类的成员函数引用看起来很相似,但是二者有本质上的区别。类的成员函数的引用,是类的内部调用;而友元函数则是在类外调用类中的私有成员,二者看起来虽然有些相似,但是千万不能弄混淆。

    将普通函数声明为友元函数使用,虽然是可以的,但是在实际操作中用的不多,大多是直接内部调用即可。而友元函数最大的作用是——在一个类中调用另一个类中的成员函数。

    #include<iostream>
    using namespace std;
    class Date;
    class Time
    {
    public:
        Time(int, int, int);
        void display(Date &);        //注意,此display函数属于Time类,但是指向了Date类;
    
    private:
        int hour;
        int minute;
        int sec;
    };
    
    class Date
    {
    public:
        Date(int, int, int);
        friend void Time::display(Date &);      //这里声明了函数display是Date的友元函数,这个函数本身还是在Time类中(可以在这个display函数中调用Date类中的私有成员);
    private:
        int month;
        int day;
        int year;
    };
    
    Time::Time(int h, int m, int s)
    {
        hour = h;
        minute = m;
        sec = s;
    }
    
    Date::Date(int m, int d, int y)
    {
        month = m;
        day = d;
        year = y;
    }
    
    void Time::display(Date &d)                      //在使用这个友元函数display时也要特别注意,引用了一个'd'('d'是一个形参);
    {
        cout << d.month << "/" << d.day << "/" << d.year << endl;
        cout << hour << ":" << minute << ":" << sec << endl;
    }
    
    int main()
    {
        Time t2(10, 13, 16);
        Date d2(12, 25, 76);
        t2.display(d2);                          //t2引用Time类中的函数display,函数display调用了Date类中的私有成员;
    return 0; }

    再次点明开头——“友元”的最大作用就是:在类外访问类中的私有部分。

  • 相关阅读:
    【卷影副本】文件属性“以前的版本”中无法看到历史文件的解决方案
    合理的网间结算和互联网转接服务,电信敢正视吗?
    FTP无法连接可能是安全狗设置的原因
    播放器播放视频画面均变暗(但网页视频正常)的解决方案
    安装国际版firefox(火狐浏览器)并设置语言为中文
    navicat for mysql注册码:NAVN-LNXG-XHHX-5NOO
    "COM Surrogate 已停止工作"解决方案(windows7 64位及32位)
    IIS7 http自动跳转到https(通过编辑Web.config实现)
    sql 时间处理
    制作时间戳和时间戳转标准日期时间等
  • 原文地址:https://www.cnblogs.com/heng-xing/p/13665887.html
Copyright © 2011-2022 走看看