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

    文章

    526

    浏览量

    45305
  • C++
    C++
    +关注

    关注

    22

    文章

    2122

    浏览量

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    发布服务提交审核

    完成所有应用信息和版本信息的配置后,可将服务提交至华为方进行发布审核。 登录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

    鸿蒙应用服务开发-Account Kit配置登录权限

    一、场景介绍 华为账号登录是基于OAuth 2.0协议标准和OpenID Connect协议标准构建的OAuth2.0 授权登录系统,服务可以方便地获取华为账号用户的身份标识,快速建立服务内
    发表于 04-15 16:03

    鸿蒙应用服务开发-Account Kit概述

    的守护措施,如仅允许访问适龄服务、增强隐私保护、限制设备使用时长等。 三、基本概念 permission:数据或接口权限,通过该权限判断应用是否能获取对应数据或调用对应接口。 四、约束与限制 华为
    发表于 03-31 12:08

    C++学到什么程度可以找工作?

    C++学到什么程度可以找工作?要使用C++找到工作,特别是作为软件开发人员或相关职位,通常需要掌握以下几个方面: 1. **语言基础**:你需要对C++的核心概念有扎实的理解,包括但不
    发表于 03-13 10:19

    HarmonyOS NEXT 原生应用/服务调试概述

    一、概述 DevEco Studio提供了丰富的HarmonyOS应用/服务调试能力,支持JS、ArkTS、C/C单语言调试和ArkTS/JS+C/
    发表于 02-26 11:03