您现在的位置是:首页 > 正文

友元

2024-02-01 01:01:03阅读 1

友元是一种定义在类外部的普通函数,但需要在类内进行声明,为了与该类的成员函数进行区分,在声明时加入关键字friend。它可以是一个函数,该函数称为友元函数。也可以是一个类,该类称为友元类。友元机制可以访问类中的保护成员和私有成员。

友元函数

class Point
{
private:
    double x,y;
public:
    Point(double xx,double yy)
    {
        x=xx;y=yy;
    }
    friend double Distance(Point & a,Point & b);    //声明友元函数
};

double Distance(Point & a,Point & b)                //定义友元函数
{
    double dx=a.x+b.x;
    double dy=a.y-b.y;
    return sqrt(dx*dx+dy*dy);
}

void main()
{
    Point p1(2.0,6.0),p2(9.0,4.0);
    double d=Distance(p1,p2);                      //调用友元函数
}

友元函数特点:

  • 声明在类体内,声明时在函数的类型说明符前加关键字 friend。
  • 定义在类体外,定义格式和普通函数相同。
  • 它是非成员函数,调用和普通函数相同。
  • 它可以直接访问该类中的私有成员。

注意:

  • 友元函数作为一个类的成员函数时,可在它所定义的类中说明,也可在另一个类中用关键词 friend 声明友元关系。
  • 友元函数在引用所在类对象的私有成员时,其引用参数可以不是所在类的对象,但声明它是友元函数类的私有成员时,引用参数必须是友元类对象。
  • 一个类的成员函数作为另一个类的友元函数时,必须先定义。

友元类

当一个类作为另一个类的友元类时,类的所有成员函数都是另一类的友元函数。例如,如果把类A声明为类B的友元类,则类A的所有成员都可以访问类B的成员。

class A
{
    //...
};
class B
{
    //...
    friend class A;    //A是B的友元类,A的所有成员都可以访问B的所有成员。
};

注意:

  • 友元类是一个单独类,它可以访问另一个类中的所有成员。
  • 友元关系不具有传递性。例如,类A是类B的友元,类B是类C的友元,但并不表示类A是类C的友元。
  • 友元关系不具有交换性。例如,类A是类B的友元,但类B不是类A的友元。

友元的提出,方便了程序的编写,但破坏了数据的封装和隐藏,使本来隐藏的信息显现出来。为了提高程序的可维护性,应尽量减少友元函数的使用,当必须使用时,要尽量调用类的成员函数,而不是直接对类的数据成员进行操作。

网站文章

  • virtualhackinglabs靶机 Mon02 10.12.2.244

    virtualhackinglabs靶机 Mon02 10.12.2.244

    2024-02-01 01:00:55
  • MySQL索引背后的数据结构及算法原理

    MySQL索引背后的数据结构及算法原理

    摘要本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题。特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BTree索引,哈希索引,全文索引等等。为了避免混乱,本文将只关注于BTree索引,因为这是平常使用MySQL时主要打交道的索引,至于哈希索引和全文索引本文暂不讨论。文章主要内容分为三个部分。第...

    2024-02-01 01:00:26
  • 获取当前日期是本年的第几周java与mysql获取值不一致

    SELECT YEARWEEK(now()); 在数据库查询出的本年第几周和java中获取的不一样, 研究了下原来是java里有两个关键设置,一个是从周几开始计算周,另外一个是一周最小要过了几天才算一...

    2024-02-01 01:00:17
  • RegExp对象的学习

    RegExp对象的学习

    1.科普:RegExp是js原生的内置对象,直接可以使用。e.g. :via RegExp.$1 取得第一个匹配子项;        默认带特殊含义的字符若要表达其本身就在其前面加个\转义,这些字符共...

    2024-02-01 01:00:11
  • js 遍历对象

    function allPrpos(obj) { // 用来保存所有的属性名称和值 var props = ""; // 开始遍历 for(var p in obj){ // 方法 if(typeof(obj[p])=="function"){ ...

    2024-02-01 00:59:43
  • 必须要学习的源码--ConcurrentHashMap

    必须要学习的源码--ConcurrentHashMap

    开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第6天,

    2024-02-01 00:59:38
  • 并发编程学习一

    关键信息作为笔记记录一下。1、重要模型:信号量模型,管程模型。管程是解决并发问题的万能钥匙(暂时还不是特别理解)。2、并发编程可以总结为三个核心问题:分工、同步、互斥。(并发包的设计可从这三个角度去划...

    2024-02-01 00:59:33
  • 浅谈 Integer的自动拆箱和装箱

    浅谈 Integer的自动拆箱和装箱

    public class IntegerDemo { public static void main(String[] args) { Integer i1 = 128; Integer i2 = 128; System.out.println(i1 == i2); System.out.println(i1.equals(i2)); System.out.pri...

    2024-02-01 00:59:25
  • JavaScript : 两个数的精确乘法

    JavaScript : 两个数的精确乘法

    为什么80%的码农都做不了架构师?>>> ...

    2024-02-01 00:58:55
  • btslab PHP SQL注入,btslab全攻略——注入之sql盲注1、2

    btslab PHP SQL注入,btslab全攻略——注入之sql盲注1、2

    之前做btslab的时候就想找篇完整教程来对照学习的,可是发现网上只有xss部分,并无完整攻略,所以就自己单独完成了btslab,整体感觉还是比较容易,不过对于新手还是很不错,可以学到很多漏洞知识与代...

    2024-02-01 00:58:49