博客
关于我
友元函数与友元类
阅读量:636 次
发布时间:2019-03-14

本文共 1877 字,大约阅读时间需要 6 分钟。

1. 朋友函数

朋友函数需要在类中任意位置进行声明,与普通函数不同的是要加上friend关键字,并在类外进行实现。朋友函数并非类的成员函数,因此可以访问该类的私有成员。

朋友函数的特点

  • 可访问私有成员:朋友函数可以访问类的私有成员。
  • 没有this指针:朋友函数没有隐藏的this指针,因此参数列表中需要多一个类的参数。
  • 灵活性:由于没有this指针,朋友函数可以完成普通成员函数无法完成的操作。
  • 朋友函数优先级:朋友函数与static成员函数类似,无this指针,但friend函数的调用优先级低于static成员函数。
  • 可多个类的朋友:一个函数可以成为多个类的朋友函数。
  • 例子

    class Complex {public:    Complex(int real = 0, int imag = 0) : m_real(real), m_imag(imag) {}    ~Complex() {}    Complex operator+(int a) {        return Complex(m_real + a, m_imag);    }private:    int m_real;    int m_imag;};class ComplexFriend {public:    ComplexFriend(int real, int imag) : m_real(real), m_imag(imag) {}    ~ComplexFriend() {}private:    int m_real;    int m_imag;};friend Complex operator+(int a, const Complex& c) {    return Complex(a + c.m_real, c.m_imag);}friend Complex operator+(const Complex& c1, const Complex& c2) {    return Complex(c1.m_real + c2.m_real, c1.m_imag + c2.m_imag);}void main() {    Complex c, c1(1, 3);    c = c1 + 10;    c = 10 + c1;    c = c1 + c2;}

    2. 朋友类

    朋友类的所有成员函数都可以是另一个类的朋友函数,并可以访问另一个类的非公有成员。

    朋友类的特点

  • 单向性:朋友关系是单向的,不具有交换性。
  • 不传递性:如果B是A的朋友,C是B的朋友,则不能说明C是A的朋友。
  • 例子

    // 声明Time类为朋友类,Date类可以访问Time类的私有成员class Date {public:    Date(int year = 1900, int month = 1, int day = 1) :        _year(year), _month(month), _day(day), _t(9, 30, 45) {}    void SetTimeOfDate(int hour, int minute, int second) {        _t._hour = hour;        _t._minute = minute;        _t._second = second;    }private:    int _year;    int _month;    int _day;    Time _t;};friend class Time;
    class Time {public:    Time(int hour, int minute, int second) :        _hour(hour), _minute(minute), _second(second) {}private:    int _hour;    int _minute;    int _second;};friend class Date;
    void main() {    Time t1(11, 2, 3);    Date d1(2020, 3, 15);    Date d2 = d1;    d1.SetTimeOfDate(1, 10, 11);}

    总结

    朋友函数和朋友类为C++提供了灵活的访问控制机制,可以实现类间的非继承式的私有成员访问。然而,朋友关系具有单向性和不传递性,需要谨慎操作。

    转载地址:http://rsulz.baihongyu.com/

    你可能感兴趣的文章
    Nginx 配置解析:从基础到高级应用指南
    查看>>
    Nginx 集成Zipkin服务链路追踪
    查看>>
    nginx 集群配置方式 静态文件处理
    查看>>
    nginx+php的搭建
    查看>>
    nginx+tomcat+memcached
    查看>>
    Nginx+Tomcat实现动静分离
    查看>>
    nginx+Tomcat性能监控
    查看>>
    nginx+uwsgi+django
    查看>>
    nginx+vsftp搭建图片服务器
    查看>>
    Nginx-http-flv-module流媒体服务器搭建+模拟推流+flv.js在前端html和Vue中播放HTTP-FLV视频流
    查看>>
    nginx-vts + prometheus 监控nginx
    查看>>
    nginx: [emerg] getpwnam(“www”) failed 错误处理方法
    查看>>
    nginx:Error ./configure: error: the HTTP rewrite module requires the PCRE library
    查看>>
    Nginx、HAProxy、LVS
    查看>>
    Nginx下配置codeigniter框架方法
    查看>>
    Nginx中使用expires指令实现配置浏览器缓存
    查看>>
    Nginx之二:nginx.conf简单配置(参数详解)
    查看>>
    Nginx代理websocket配置(解决websocket异常断开连接tcp连接不断问题)
    查看>>
    Nginx代理初探
    查看>>
    nginx代理地图服务--离线部署地图服务(地图数据篇.4)
    查看>>