4.7 友元

2024-01-17 19:08
文章标签 4.7 友元

本文主要是介绍4.7 友元,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在面向对象的程序设计中,类的封装性使得我们使用类(对象)的成员数据时经常要通过类(对象)的成员函数。这对于类是一种保护。但在某些情况下,频繁的成员函数调用使得效率严重受损。

例如,定义矩阵类,并有两个矩阵对象相乘,为了获得矩阵中的元素值(私有成员),要频繁调用取值函数(公有成员)。

怎样可以提高效率?——使用友元函数。在C++中友元( friend )函数允许在类外访问该类中的任何成员,就象类的成员函数一样。

友元函数用关键字 friend 说明。下面用友元函数重载运算符“+”,以实现c=d+c。(即实数与复数的加法。)

◆ 1、定义友元函数的一般格式:
首先,在类声明里声明:
class Complex
{
     ……
    friend Complex operator + (double,Complex);
}; 
/*opration+为类Complex类的友元函数, friend只用于类说明中 ……*/
第二步,在类外定义:
Complex operator + (double d , Complex c)
{
    return Complex(d+c.Real , c.Image) ;
}

//注意友元不是成员函数,在类声明以外的地方也不加friend
第三步,使用,友元函数可以在任何地方直接访问类的私有成员
void main(void)
{
    …… c=d+c1;
}

这里d+c1被C++编译器解释为operator+(d,c1),即调用友元函数operator+(d,c1)。

◆ 2、再进一步,如果使用友元函数
     friend complex operator +(complex c1 , complexc2) ;
无论是复数与复数相加,还是实数与复数相加(不论实数在前还是在后)都可以用。为什么呢?

因为有此例所定义的缺省的构造函数,实数会被强制转换为虚部为零的复数。d+c1被解释为:
     operator+(complex(d) , c1)

◆ 3、
friend Complex operator+(const Complex & c1,const Complex & c2)
{
       ……
}


这里采用Complex对象的引用而不是对象本身,调用时不再重新分配内存建立一个复制的对象,函数效率会更高。加const,实参只读,可防止实参被修改。

◆ 4、单目运算符前置“++”的友元函数重载方式如下:
Complex Complex::operator++(Complex & c )
{
       return (++c.Real , ++c.Image) ;
}

采用友元函数方式定义与使用都很方便。但采用友元方式必须使用引用,因为被施加“++”运算的是一个参数。

◆ 5、友元函数重载后置“++”如下:
friend Complex operator++(Complex & c , int)
{
       Complex temp=c;
       c.Real++ , c.Image++ ;
       return temp;
}

采用引用类型,实参c做了++,而temp是++前的值。

◆ 6、友元函数注意点:
  • 友元函数不是类的成员函数,在友元函数体中访问对象的成员,必须用对象名加运算符“.”加对象成员名。这一点和一般函数一样。但友元函数可以访问类中的所有成员(公有的、私有的、保护的),一般函数只能访问类中的公有成员;
  • 友元函数不受类中的访问权限关键字限制,可以把它放在类的公有、私有、保护部分,但结果一样;
  • 某类的友元函数的作用域并非该类域。如果该友元函数是另一类的成员函数,则其作用域为另一类的类域,否则与一般函数相同。
  • 友元函数破坏了面向对象程序设计类的封装性,所以友元函数如不是必须使用,则尽可能少用。或者用其他手段保证封装性。
    友元还有友元类概念,整个类可以是另一个类的友元。友元类的每个成员函数都是另一个类的友元函数,都可访问另一个类中的保护或私有数据成员。定义方法如下:
    class A
    {
        ……
        friend class B; //B为A的友元类
        ……
    };

这篇关于4.7 友元的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/616916

相关文章

据阿谱尔APO Research调研显示,2023年全球髓内钉市场销售额约为4.7亿美元

根据阿谱尔 (APO Research)的统计及预测,2023年全球髓内钉市场销售额约为4.7亿美元,预计在2024-2030年预测期内将以超过3.82%的CAGR(年复合增长率)增长。 髓内钉市场是指涉及髓内钉制造、分销和销售的行业。髓内钉是一种用于整形外科手术的医疗器械,用于稳定长骨骨折,特别是股骨、胫骨和肱骨。髓内钉通常由不銹钢或钛等材料制成,并插入骨的髓管中,以在愈合过程中提供结构支

【C++】初始化列表、匿名对象、static成员、友元、内部类

文章目录 一、初始化列表构造函数体赋值初始化列表explicit关键字 二、匿名对象三、static成员四、友元友元函数友元类 五、内部类六、练习题 一、初始化列表 构造函数体赋值 实际上,构造函数的函数体内,并不是对 对象 初始化的地方,而是对成员变量进行赋值。因为初始化只能初始化一次,而构造函数体内可以多次赋值。 class Date{public:Date(int

ArcGIS API for JavaScript 4.7 最新版教程

由于公司最近有地图开发任务,且DIY需求较高,所以采用了arcgis服务为基础。 网上资料太少,而且都是复制粘贴的东西,懒得看,花了一个星期边看官方说明边做,踩坑无数! 为了同样奋斗在Arcgis服务中的同学少走弯路,故整理一下自己踩的坑和实现的功能。 本博客从最基本的离线服务部署开始讲解,逐步深入,主要包括地图加载时自定义视角,自定义图片点位标注,自定义信息窗体,标注点位重合时如何获取重合

从0开始C++(五):友元函数运算符重载

友元函数 介绍 C++中的友元函数是一种特殊的函数,它可以访问和操作类的私有成员和保护成员。友元函数可以在类的内部或外部声明和定义,但在其声明和定义中需要使用关键字 friend 来标识。友元函数可以是全局函数,也可以是其他类的成员函数。 下面是友元函数的一些重要特点和用法: 友元函数可以访问和操作类的私有成员和保护成员,这使得函数可以直接访问类的私有数据,而无需通过类的公有接口进行

【OCPP】ocpp1.6协议第4.7章节Meter Values的介绍及翻译

目录 4.7、仪表值MeterValues-概述 MeterValues 请求消息 MeterValues 响应消息 使用场景 1. 定期报告 2. 事务相关报告 示例 MeterValues 请求示例 处理 MeterValues 响应 示例代码 构建和发送 MeterValues 请求 可能的错误处理 总结 4.7、仪表值MeterValues-原文译文

C++多重继承,虚基类与友元

一.多重继承 就是一个类继承多个基类; class <派生类名>:<派生方式1><基类名1>,```<派生方式n><基类名n> class Derived:public:Base1,public:Base2 上述形式:基类之间由逗号隔开,且必须指明继承方式,否则默认为私有继承; 1.注意事项: a.各种派生方式对于基类成员在派生类中的访问权限与单继承相同; b.在使用多继承时,对

C#友元函数与友元类

在C#中,并没有像C++那样的友元函数和友元类的直接语法支持。C#中的访问控制是通过public、private、protected等访问修饰符来实现的,而不是通过友元的概念。 友元函数与友元类的概念 在C++中,友元函数和友元类允许一个类或者函数访问另一个类的私有成员。这在某些特定情况下可能很有用,比如提高代码的封装性或者方便某些特定的操作。 友元函数:一个非成员函数可以被声明为一个类的

C++类的友元成员

类的友元成员: 通过友元成员可以让外部函数直接访问类的私有数据。友元成员可以声明在类的任何地方:私有地方或公有部分。一个函数可以是多个类的友元函数,但需要在各类中分别声明。友元函数的定义可以在类的内部,也可以在外部。友元成员有三种:友元函数、友元成员函数和友元类。友元函数增加了类和外部的接口,节省了调用成员函数的开销。类之间的友元关系不能传递;友元关系不可逆。 代码范例: #includ

C++面向对象-11-友元

这篇来学习一个新的知识点:友元。生活中你的家有客厅和卧室,客厅是所有客人都可以进去,但是卧室是私有的,在程序中,客厅就是public权限,卧室是private权限。但是,有一些特殊的,在程序中,有一些被定义成private的属性,也想让类外特殊的一些函数或者类进行访问,就需要用到友元技术。 友元的目的就是让一个函数或者类可以访问另一个类中私有成员,友元的关键字为friend 友元的三种实现

2021-11-08 C++封装继承多态---C++对象模型和this指针、友元、运算符重载(附代码理解)

3. C++对象模型和this指针 3.1 成员变量和成员函数分开存储 在C++中,类内的成员变量和成员函数分开存储,只有非静态成员变量才属于类的对象上。 #include<iostream>using namespace std;class person{int m_a; //非静态成员变量 属于类的对象上的static int m_b;//静态成员变量 不属于类的对象上的v