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

    文章

    512

    浏览量

    43904
  • C++
    C++
    +关注

    关注

    21

    文章

    2066

    浏览量

    72900
收藏 人收藏

    评论

    相关推荐

    鸿蒙原生应用服务开发-WebGL网页图形库开发概述

    着色器和片段着色器(均由 GLSL 语言所写)。 四、 运作机制 图1 WebGL运作机制 应用前端HTML5绘制界面组件。 Native API完成前端JavaScript与C++代码交互
    发表于 03-08 14:24

    生智能」获千万融资 原小天才团队牵手云从科技进军银发赛道

    研发、渠道资源、供应链资源等优势。在供应链方面,由于团队资源优势,硬件产品的成本价格控制接近大厂水平。生智能的创始人、CEO邓龙生曾任小天才学习平板产品负责人、星火教育集团合伙人兼互联网中心负责人
    发表于 01-05 11:48

    鸿蒙原生应用/服务开发-Serverless账户验证码的问题

    在应用/服务早期使用过程中,-Serverless账户验证码的格式是[AGC][应用/服务名称],如下图。 但是,在最近,[应用/服务]名称直接变成了【default】,用户收到这种验证码后,心里存有疑虑的,这是哪里配置或
    发表于 12-27 15:55

    工业宇宙与数字孪生的爱恨情仇

    数字孪生宇宙
    dianliang02
    发布于 :2023年12月13日 16:54:51

    【年终狂欢】200京东卡、100加油卡...采购福利来袭!

    岁末年终,为了感谢广大客户一年来的支持与厚爱,华秋商城特推出年终采购送福利活动! 满额即赠腾讯VIP月卡、100加油卡、200京东卡! 我们知道,采购成本对于企业的经营至关重要,因此我们在过
    发表于 12-12 15:06

    鸿蒙原生应用/服务开发-AGC分发如何下载管理Profile

    一、收到通知 尊敬的开发者: 您好,为支撑鸿蒙生态发展,HUAWEI AppGallery Connect已于X月XX日完成存量HarmonyOS应用/服务的Profile文件更新,更新后
    发表于 11-29 15:10

    鸿蒙原生应用开发-服务分发方式的调整及趋势

    服务上架审核通过后,会收到邮件通知,但此时还无法搜索到上架的服务,需要华为进行配置后,才能让服务露出。当前,服务分发的主要渠道有: 1.应用市场:具备搜索能力,在搜索结果的“服
    发表于 11-14 16:02

    HarmonyOS鸿蒙原生应用开发设计- 服务(原子化服务)图标

    HarmonyOS设计文档中,为大家提供了独特的服务图标,开发者可以根据需要直接引用。 开发者直接使用官方提供的服务图标内容,既可以符合HarmonyOS原生应用的开发上架运营规范,又可
    发表于 11-01 16:55

    关于HarmonyOS服务的主题演讲与合作签约

    特征 以元气学习为例,了解元服务多样化的分发路径与整体样式。 3.企业高效开发服务项目的关键因素与主要流程 三、合作签约 持续努力 六家合作客户董事长与我们在HDC.Together华为开发者大会
    发表于 09-05 10:23

    如何使用AGDS全网分发HarmonyOS服务

    服务直达(AppGallery Distribute Service),简称AGDS,是华为应用市场为各渠道提供的分发服务的标准接入产品。 可以拼接Preview Link,然后将链接投放至
    发表于 06-07 10:58

    HarmonyOS服务分发新体验负一屏搜索、应用市场服务专区

    我们看到,相比以前的原子化服务的分发途径,没有了服务中心;增加了负一屏的搜索和华为应用市场服务的分类,我们认为是服务进入流量分发主战场的一个标志。 负一屏 打开负一屏搜索页,输入关键字,搜索获取
    发表于 06-06 16:14