在封装中C++类数据成员大多情况是private属性;但是如果接口采用多参数实现肯定影响程序效率;然而这时候如果外界需要频繁访问这些私有成员,就不得不需要一个既安全又理想的“后门”——友元关系;

C++中提供三种友元关系的实现方式,友元函数、友元成员函数、友元类。

友元函数:既将一个普通的函数在一个类中说明为一个friend属性;其定义(大多数会访问该类的成员)应在类后;

友元成员函数:既然是成员函数,那么肯定这个函数属于某个类,对了就是因为这个函数是另外一个类的成员函数,有时候因为我们想用一个类通过一个接口去访问另外一个类的信息,然而这个信息只能是被它授权的类才能访问;那么也需要用friend去实现;这个概念只是在声明的时候稍有变化;

友元类:友元类声明会将整个类说明成为另一个类的友元关系;和之前两种的区别是集体和个人的区别;友元类的所有成员函数都可以是另一个类的友元函数;

值得注意的是友元关系是单向的,有点像我们恋爱中出现的单相思 O(∩_∩)O,单向关系就是说如果A被说明成B的友元关系,那么只能说A是B的友元,并不代表B是A的友元;其次在多数情况下友元关系的函数都会访问它被说明中类的成员,这时候应该将函数定义在类的后面;

下面给一个简单的例程代码;

#include <iostream>

using namespace std;

class B;

class A{
    private:
        int x;
    public:
        A();
        void display(B &);
};

class C;

class B{
    private:
        int y;
        int z;
    public:
        B();
        B(int, int);
    friend void A::display(B &);//友元成员函数
    friend void display(B &);//友元函数
    friend class C;//友元类
};

class C{
    private:
        int sum;
        void calc(B &);
    public:
        C();
        void display(B &);
};

//必须在友元关系的类后进行定义
void display(B &v)//友元函数
{
    cout << v.y << " " << v.z << endl;
}

A::A()
{
    this->x = 0;
}

void A::display(B &v)//友元成员函数
{
    this->x = v.y + v.z;
    cout << this->x << endl;
}

B::B()
{
    this->y = 0;
    this->z = 0;
}

B::B(int y, int z)
{
    this->y = y;
    this->z = z;
}

C::C()
{
    sum = 0;
}

void C::display(B &v)
{
    this->calc(v);
    cout << sum << " = " << v.y << " + " << v.z << endl;
}

void C::calc(B &v)
{
    sum = v.y + v.z;
}

int main()
{
    A a;
    B b(2, 3);
    display(b);
    a.display(b);
    C c;
    c.display(b);

    return 0;
}

浅谈C++中的友元关系的更多相关文章

  1. 浅谈javaScript中的继承关系<一>

    // JavaScript Document //创建三个构造函数 function Shape(){ this.name='ahape'; this.toString=function(){retu ...

  2. 浅谈Java中的equals和==(转)

    浅谈Java中的equals和== 在初学Java时,可能会经常碰到下面的代码: 1 String str1 = new String("hello"); 2 String str ...

  3. 浅谈Java中的equals和==

    浅谈Java中的equals和== 在初学Java时,可能会经常碰到下面的代码: String str1 = new String("hello"); String str2 = ...

  4. 浅谈C中的malloc和free

    转自http://bbs.bccn.net/thread-82212-1-1.html非常感谢作者 浅谈C中的malloc和free 在C语言的学习中,对内存管理这部分的知识掌握尤其重要!之前对C中的 ...

  5. 浅谈HTTP中GET、POST用法以及它们的区别

    浅谈HTTP中GET.POST用法以及它们的区别 HTTP定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE.URL全称是资源描述符.我们可以这样认为: 一 ...

  6. Java网络编程和NIO详解7:浅谈 Linux 中NIO Selector 的实现原理

    Java网络编程和NIO详解7:浅谈 Linux 中NIO Selector 的实现原理 转自:https://www.jianshu.com/p/2b71ea919d49 本系列文章首发于我的个人博 ...

  7. 【转】浅谈Java中的equals和==

    浅谈Java中的equals和== 在初学Java时,可能会经常碰到下面的代码: String str1 = new String("hello"); String str2 = ...

  8. 浅谈Java中接口与抽象类的异同

    浅谈Java中接口与抽象类的异同 抽象类和接口这两个概念困扰了我许久,在我看来,接口与抽象类真的十分相似.期间也曾找过许许多多的资料,参考了各路大神的见解,也只能是简简单单地在语法上懂得两者的区别.硬 ...

  9. 浅谈 HTTP中Get与Post的区别

    浅谈 HTTP中Get与Post的区别 存在的误区 有人说 HTTP 协议下的 Get 请求参数长度是有大小限制的,最大不能超过XX,而 Post 是无限制的,看到这里,我想他们定是看多了一些以讹传讹 ...

随机推荐

  1. Miller-Rabin,Pollard-Rho(BZOJ3667)

    裸题直接做就好了. #include <cstdio> #include <cstdlib> #include <algorithm> using namespac ...

  2. (转)FIDDER教程

    Fiddler是最强大最好用的Web调试工具之一,它能记录所有客户端和服务器的http和https请求,允许你监视,设置断点,甚至修改输入输出数据. 使用Fiddler无论对开发还是测试来说,都有很大 ...

  3. C语言程序设计第四次作业-选择结构

    (一)改错题 输出三角形的面积和周长,输入三角形的三条边a.b.c,如果能构成一个三角形,输出面积area和周长perimeter(保留2位小数):否则,输出"These sides do ...

  4. Jenkins简明入门(一) -- 安装

    如今Jenkins官网的Guide里使用了Docker,网上很多Jenkins入门教程都已过时了,所以写这一篇入门教程. 官网的Guide Link是:https://jenkins.io/doc/p ...

  5. Linux必备操作vim

    vim被称作为编辑器之神,那么在我们操作linux系统时,进行编辑操作有没有感觉心有余而力不足?今天我讲自己总结的一些vim的操作命令和大家进行一下分享,有不足之处还请指出. vim的三种模式大家还记 ...

  6. Mybatis中 collection 和 association 的区别

    public class A{ private B b1; private List<B> b2;} 在映射b1属性时用association标签,(一对一的关系) 映射b2时用colle ...

  7. android高德地图网络路径实现自定义marker并点击弹出自定义窗口

    android中使用地图的地方随处可见,今天记录一下网络路径生成自定义marker,点击标记弹出自定义的窗口(在这里使用的是高德地图) 在这里我们使用Grilde去加载网络图片,因为这个简直太方便了! ...

  8. Redis数据库之概念与创建服务

      概念                                  Remote   Dictionary  Server key-value  数据库存储系统,数据结构服务器. 键是Stri ...

  9. linux的简单命令 网络配置

    1.1.1 ls命令 l ls(list)功能:列出目录内容 l 格式:ls [参数] [文件或目录] -a或--all   下所有文件和目录.注意隐藏文件.特殊目录.. 和 .. -l   使用详细 ...

  10. acm几何

    fzu 2231,N个点求构成的平行四边行个数. 题意简重点在优化上 #include <cstdio> #include <iostream> #include <cs ...