0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

C++之友元的学习总结 友元的概念

电子设计 来源:电子设计 作者:电子设计 2020-12-24 17:06 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

一、友元的概念:

1、什么是友元?

友元是c++中的一种关系

友元关系发生在函数与类之间或者类与类之间

友元关系是单项的,不能传递

2、友元的用法:

在类中以friend关键字声明友元

类的友元可以是其它类或者具体函数

友元不是类的一部分

友元不受类中访问级别的限制

友元可以直接访问具体类的所有成员

3、友元的语法:

在类中使用friend 关键字对函数或者类进行声明:

class Test

double x;
double y;
friend void func(Test& t);
};
void func(Test& t)

注意:func() 全局函数是 Test 类的友元,func() 可以访问Test 类的所有成员,但是 func() 不是 Test 的成员函数。

示例代码:

#include <stdio.h>
#include <math.h>
class Test

double x;
double y;
public:
Test(double x,double y)

this->x=x;
this->y=y;

double getX()

return x;

double getY()

return y;

friend double func(Test& t1,Test& t2);
};
double func(Test& t1,Test& t2)

double ret =0;
ret = (t2.y-t1.y)*(t2.y-t1.y)+(t2.x-t1.x)*(t2.x-t1.x);
ret = sqrt(ret);
return ret;

int main()

Test t1(1,2);
Test t2(10,20);
printf("t1(%f,%f)",t1.getX(),t1.getY());
printf("t2(%f,%f)",t2.getX(),t2.getY());
printf("(t1,t2)=%f",func(t1,t2));

return 0;

输出结果:

root@txp-virtual-machine:/home/txp/add# g++ test.cpp
root@txp-virtual-machine:/home/txp/add# ./a.out
t1(1.000000,2.000000)
t2(10.000000,20.000000)
(t1,t2)=20.124612

4、友元的尴尬:

友元是为了兼顾c语言的高效而诞生的

友元直接破坏了面向对象的封装性

友元在实际开发产品中的高效是得不偿失的

友元在软件工程中已经慢慢被遗弃了

5、注意事项:

友元关系不具备传递性

类的友元可以是其它类的成员函数

类的友元可以是某个完整的类

所有的成员函数都是友元

代码测试:

#include <stdio.h>
class ClassC

const char* n;
public:
ClassC(const char* n)

this->n = n;


friend class ClassB;
};
class ClassB

const char* n;
public:
ClassB(const char* n)

this->n = n;


void getClassCName(ClassC& c)

printf("c.n = %s", c.n);


friend class ClassA;
};
class ClassA

const char* n;
public:
ClassA(const char* n)

this->n = n;


void getClassBName(ClassB& b)

printf("b.n = %s", b.n);

/*
void getClassCName(ClassC& c)

printf("c.n = %s", c.n);

*/
};
int main()

ClassA A("A");
ClassB B("B");
ClassC C("C");

A.getClassBName(B);
B.getClassCName(C);

return 0;

输出结果:

root@txp-virtual-machine:/home/txp/add# ./a.out
b.n = B
c.n = C

如果把上面屏蔽的那部分代码打开,编译就会报错(因为友元没有传递性哦):

root@txp-virtual-machine:/home/txp/add# g++ test.cpp
test.cpp: In member function ‘void ClassA::getClassCName(ClassC&)’:
test.cpp:5:17: error: ‘const char* ClassC::n’ is private
const char* n;

test.cpp:48:32: error: within this context
printf("c.n = %s", c.n);

6、小结:

友元是为了兼顾c语言的高效而诞生的

友元直接破坏了面向对象的封装性

友元关系不具备传递性

类的友元可以是其它类的成员函数

类的友元可以是某个完成的类

二、总结:

好了,今天的分享就到这里,如果文章中有错误或者不理解的地方,可以交流互动,一起进步。我是txp,下期见!

审核编辑:符乾江
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 可编程逻辑
    +关注

    关注

    7

    文章

    531

    浏览量

    45539
  • C++
    C++
    +关注

    关注

    22

    文章

    2139

    浏览量

    77555
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    OCAD应用:二组连续变焦系统

    二组连续变焦系统实质上是对三组变焦补偿形式的简化。他利用后面的变焦组的轴向移动产生系统变焦比,由于变焦系统运动产生的相面位移量有前组位移补偿。该形式变焦系统的前组不是固定组,为此对此类系统
    发表于 04-21 08:23

    OCAD应用:四组连续变焦系统

    | | 四组连续变焦系统是在三组连续变焦系统的基础上增加了一个变焦组分担系统像面位移,由两个变焦组一个补偿组,再加一个前固定组和后固定组组成。两个变焦组可以接连在一起,第二个变焦组固定不动,也
    发表于 04-17 08:20

    服务交易评价

    功能简介 服务交易评价是服务平台官方提供的,反映用户对服务交易体验的评价系统。在服务中产生交易的用户,可以针对本元服务的交易体验进行打分、发表评论。 真实的评价内容可以帮助用户
    发表于 12-29 10:35

    C语言和C++之间的区别是什么

    (inheritance)、多态(polymorphism)等面向对象编程概念。程序员可以通过定义类来创建对象,并利用类的实例进行操作。 2、类型系统与安全性: C++具有更为严格的类型检查机制
    发表于 12-11 06:23

    发布服务提交审核

    完成所有应用信息和版本信息的配置后,可将服务提交至华为方进行发布审核。 登录AppGallery Connect,点击“APP与服务”。 选择要发布的服务。 左侧导航选择“应用上架 &
    发表于 12-04 14:23

    发布服务设置上架时间

    设置上架时间 登录AppGallery Connect,点击“APP与服务”。 选择要发布的服务。 左侧导航选择“应用上架 > 版本信息”下待发布的版本。 进入“上架
    发表于 12-03 09:46

    发布服务填写审核信息与联系方式

    填写审核信息 登录AppGallery Connect,点击“APP与服务”。 选择要发布的服务。 左侧导航选择“应用上架 > 版本信息”下待发布的版本。 进入“应用审核信息”区域
    发表于 12-01 14:30

    发布服务配置隐私声明

    服务必须先使用AGC的隐私声明托管服务生成自己的隐私声明,才能在版本信息页面选择到。详细内容参见配置隐私声明(服务)和配置用户协议。 登录AppGallery Connect,点击“APP与
    发表于 11-25 11:24

    发布服务配置内容分级

    年龄分级作为服务的重要属性,在华为应用市场的应用详情页展示给用户,帮助用户找到适合其年龄段的服务,从而为未成年人用户打造纯净的使用环境。 1.AGC提供了调查问卷,根据您回答的内容,自动生成
    发表于 11-21 11:29

    发布服务配置本地化基础信息(应用名称、图标)

    您可以添加元服务支持的语言,并配置对应语言的本地化信息。 例如,当您设置简体中文为默认语言,并且只配置中文的本地化信息,那么服务在所有设置的发布国家或地区的信息都将显示中文。如果您还设置了英文
    发表于 10-24 17:42

    脉冲神经模型的硬件实现

    如图所示展示了LIF神经的膜电势Vmem随时间戳timestamp动态变化的过程,当接收到输入脉冲后,LIF神经的膜电势值Vmem便会升高,直至达到阈值电压Vthersh,此时神经产生输出脉冲
    发表于 10-24 08:27

    服务配置支持设备

    发布时,您可以为服务配置分发至多种设备,默认发布设备为您创建元服务用时选择的设备类型,您可以根据实际情况进行修改。您只需发布一次,用户即可在多种设备上使用您的服务。 登录AppGallery
    发表于 10-22 16:54

    服务上架自检

    为提高服务审核通过率,建议您使用上架自检功能。该功能使用热门移动终端设备,按照华为应用市场上架标准对服务进行兼容性、稳定性、性能、功耗、UX、隐私等测试,可帮助您提前发现和解决问题。 登录
    发表于 10-21 17:18

    服务发布准备工作

    发布服务前,请详细了解华为应用市场的审核要求,并提前准备发布所需的文件、资源,以便您能顺利、快速通过发布审核流程。 仔细阅读服务审核指南,了解发布服务至华为应用市场需要遵循的规则和要求。 完成
    发表于 10-10 15:48

    【「Yocto项目实战教程:高效定制嵌入式Linux系统」阅读体验】+基础概念学习理解

    是 Yocto 项目的核心部分之一,书中对数据的概念、文件、语法以及菜谱和层的相关内容进行了详细阐述。通过学习这部分内容,我了解到数据在 Yocto 项目中的重要性,它定义了构建系
    发表于 08-04 22:29