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

    文章

    515

    浏览量

    44086
  • C++
    C++
    +关注

    关注

    22

    文章

    2108

    浏览量

    73642
收藏 人收藏

    评论

    相关推荐

    服务也需要安装

    服务也需要安装
    发表于 11-07 16:52

    服务FreeBrowser演示效果

    服务FreeBrowser演示效果
    发表于 11-07 16:50

    蚂蚁工场获亿C++轮融资,加速智能制造与工业互联网布局

    深圳蚂蚁工场科技有限公司(简称“蚂蚁工场”)近日宣布成功完成超过亿人民币的C++轮融资,此轮融资由北京信息产业发展基金和北京经开区产业升级股权投资基金联合注资。此次融资不仅彰显了资本市场对蚂蚁工场发展潜力的高度认可,也为其未来的发展注入了强劲动力。
    的头像 发表于 07-19 16:22 540次阅读

    C++中实现类似instanceof的方法

    C++有多态与继承,但是很多人开始学习C++,有时候会面临一个常见问题,就是如何向下转型,特别是不知道具体类型的时候,这个时候就希望C++ 可以向Java或者Python中有insta
    的头像 发表于 07-18 10:16 584次阅读
    <b class='flag-5'>C++</b>中实现类似instanceof的方法

    服务体验-服务管理与分享

    服务管理 通过桌面、负一屏、应用市场、服务等场景对服务进行添加、收藏、移除等管理操作。 服务分享 服务与服务卡片支持近场与远场分享,可流转给设备也可以分享给联系人。 收到他人分享的
    发表于 07-16 15:43

    服务体验-服务发现

    服务发现,无论线上或线下的方式都可以发现服务。 线上:基于用户意图。从精准意图的搜索、用户事件触发的推荐到主动探索等场景。用户可以在设备的负一屏、全局搜索、应用市场、桌面等场景发现服务。 线下
    发表于 07-15 17:02

    服务体验-服务使用

    服务使用 使用流程:通过服务入口打开元服务→启动加载→服务落地页使用→退出服务。 服务状态:服务状态可以在系统中多个地方实时显示和更新,包括锁屏、实况窗、负一屏。可通过这些系统级入口,开发者
    发表于 07-12 15:57

    人工神经模型的基本构成要素

    人工神经模型是人工智能领域中的一个重要概念,它模仿了生物神经的工作方式,为机器学习和深度学习提供了基础。本文将介绍人工神经
    的头像 发表于 07-11 11:28 1270次阅读

    人工神经模型的基本原理是什么

    人工神经模型是人工智能领域中的一个重要概念,它模仿了生物神经系统中的神经行为,为机器学习和深度学习提供了基础。 一、人工神经
    的头像 发表于 07-11 11:26 746次阅读

    人工神经模型的三要素是什么

    人工神经模型是人工智能和机器学习领域中非常重要的概念之一。它模仿了生物神经的工作方式,通过数学和算法来实现对数据的处理和学习。 一、人工
    的头像 发表于 07-11 11:13 918次阅读

    工业宇宙的应用场景有哪些

    随着科技的飞速发展,宇宙这一概念逐渐成为人们关注的焦点。宇宙是一个虚拟的、数字化的世界,它将现实世界与虚拟世界相互融合,为人们提供了一个全新的互动、交流和创新的平台。在工业领域,工业
    的头像 发表于 06-11 10:24 647次阅读

    国内矿山无人驾驶公司易控智驾获得3亿C++轮融资

    近日,国内矿山无人驾驶公司易控智驾获得3亿C++轮融资,本轮由老股东兴杭国投和紫金矿业领投,郑州人才基金跟投。
    的头像 发表于 03-13 11:40 817次阅读

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

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

    c语言,c++,java,python区别

    操作系统、嵌入式系统等对性能要求较高的场景。C语言的语法相对简单,学习曲线较平缓,也是学习其他高级语言的入门语言。 C++C++是在
    的头像 发表于 02-05 14:11 2388次阅读

    C++简史:C++是如何开始的

    MISRA C++:2023,MISRA® C++ 标准的下一个版本,来了!为了帮助您做好准备,我们介绍了 Perforce 首席技术支持工程师 Frank van den Beuken 博士撰写
    的头像 发表于 01-11 09:00 594次阅读
    <b class='flag-5'>C++</b>简史:<b class='flag-5'>C++</b>是如何开始的