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; }

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

  • 相关阅读:
    pom.xml将jar包导入
    获取当前系统日期的前一天日期
    判断socket连接是否失效
    java读取数据,2,2,1方式读取
    笔记
    回调机制
    吧字符串按逗号分割为数组
    时间格式的转变
    java.net.SocketException四大异常解决方案
    log4j
  • 原文地址:https://www.cnblogs.com/heng-xing/p/13665887.html
Copyright © 2011-2022 走看看