C++基础之友元(十)

news2024/11/27 0:19:38

由于C++类的封装性,所以类的私有成员只能在类的内部访问,类之外是不能访问他们的。但是如果将其他类设置为类的友元(friend),那么其他类也可以访问该类的私有成员。如果把类比作是一个家庭的话,那么private就是这个家庭的秘密,一般的外人是不能知道这些秘密的,只有friend才能知道这些秘密。

一.友元的形式

1.友元函数之全局函数

#include <iostream>
#include <math.h>

using std::cout;
using std::endl;
using std::cin;


 class Point
 {
private:
    int _x;
    int _y;
    //友元函数不是类的成员函数
    friend double distance(const Point& x_rhs,const Point& y_rhs);

public:
    Point(int a,int b)
    :_x(a)
    ,_y(b)
    {
        cout<<"Point()"<<endl;
    }
    ~Point()
    {
        cout<<"~Point()"<<endl;
    }
 };

 double distance(const Point& x_rhs,const Point& y_rhs)
 {
    return hypot(x_rhs._x-x_rhs._y,y_rhs._x-y_rhs._y);
 }
 int main()
 {
    Point a(2,3);
    Point b(3,4);
    cout<<distance(a,b)<<endl;
    return 0;
 }

其中有几点需要注意:

1.类中的友元函数不是该类的成员函数。也就是说友元函数不含有this指针。

2.hypot(a,b)函数是将a^2+b^2开平方。

2.友元函数之成员函数

#include <iostream>
#include <math.h>

using std::cin;
using std::cout;
using std::endl;

class Point;

class Line
{
public:
    double distance(const Point &rhs1, const Point &rhs2);
 
    void setPoint(Point& pt,int _x,int _y);
};

class Point
{
private:
    int _x;
    int _y;

    friend double Line::distance(const Point &rhs1, const Point &rhs2);
    friend void Line::setPoint(Point& pt,int _x,int _y);
public:
    Point(int a, int b)
        : _x(a), _y(b)
    {
        cout << "Point()" << endl;
    }
    ~Point()
    {
        cout << "~Point()" << endl;
    }
};

double Line::distance(const Point &rhs1, const Point &rhs2)
{
    return hypot(rhs2._x - rhs1._x, rhs2._y - rhs1._y);
}
void Line::setPoint(Point& pt,int _x,int _y)
{
    pt._x=_x;
    pt._y=_y;
}

int main()
{
    Point a(1,2);
    Point b(2,3);
    cout<<Line().distance(a,b)<<endl;
    return 0;
}

有几点需要注意的是:

在设置类的成员函数为友元时,要注意如果在第一个类中使用了一个未定义的类时需要提前声明,其中class Point;就是这个作用。但是如果继续在class Line{ };中 将成员函数double distance(const Point &rhs1, const Point &rhs2);都实现就会报

因为声明类class Point;时,只是告诉编译器有这个类,但是并不知道这个类中的成员函数。因此需要将成员函数的实现放在类class Point;实现的后面,如代码所示。

3.友元函数之友元类

如上面的代码所示,类 class Line中所有的成员函数都是类class Point; 的友元,我们就可以把类class Line设置成友元类。

将代码

替换成

总结:

1.友元的声明是不受关键字private,public,protect限制的,并且友元的关系是不能传递的

2.友元是单向的,如A是B的友元,但B不一定是A的友元

3.友元关系不能被继承。

由于友元会破坏类的封装性,所以要谨慎使用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1530745.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

安防监控平台EasyCVR使用管理员权限登录后,平台菜单栏显示不全是什么原因?

安防视频监控系统EasyCVR视频综合管理平台&#xff0c;采用了开放式的网络结构&#xff0c;平台能在复杂的网络环境中&#xff08;专网、局域网、广域网、VPN、公网等&#xff09;将前端海量的设备进行统一集中接入与视频汇聚管理&#xff0c;平台支持设备通过4G、5G、WIFI、有…

国创证券|中国资产,突传重大利好!外资最新动作曝光!

外资正在从头定价我国财物。 据彭博社最新报导&#xff0c;全球基金正在活跃购入我国股票&#xff0c;已接连第2个月净买入我国股票。其间&#xff0c;挪威的Skagen AS以及美国的Boston Partners两家全球基金近几个月来大举增持了A股、港股相关股票&#xff0c;增持的理由是&a…

最新Java面试题3【2024初级】

下载链接&#xff1a;博主已将以上这些面试题整理成了一个面试手册&#xff0c;是PDF版的 互联网大厂面试题 1&#xff1a;阿里巴巴Java面试题 2&#xff1a;阿里云Java面试题-实习生岗 3&#xff1a;腾讯Java面试题-高级 4&#xff1a;字节跳动Java面试题 5&#xff1a;字…

Markdown 最全语法指南 —— 看这一篇就够了

目录 一. 前言 二. Markdown 标题语法 三. Markdown 段落语法 四. Markdown 换行语法 五. Markdown 强调语法 六. Markdown 引用语法 七. Markdown 列表语法 八. Markdown 代码语法 九. Markdown 分隔线语法 十. Markdown 链接语法 十一. Markdown 图片语法 十二. Markdown 转义…

10 个最佳免费水印去除工具,可去除照片中的任何水印

水印可以保护您的照片&#xff0c;但时不时地&#xff0c;您需要一个应用程序来删除它们。有很多免费的水印去除应用程序可以帮助您做到这一点&#xff0c;其中包括奇客水印管家&#xff0c;它还有更多功能可供探索。继续阅读以发现 10 个最佳免费水印去除剂以及如何从照片中去…

C++第八弹---类与对象(五)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】 目录 1、运算符重载 1.1、赋值运算符重载 1.2、前置和后置重载 2、const成员 3、取地址及const取地址操作符重载 总结 1、运算符重载 1.1、赋值运…

opencv 傅里叶变换(低通滤波 + 高通滤波)

文章目录 1、傅里叶变换2、通过numpy实现3、高通滤波器5、通过opencv实现傅里叶变换6、低通滤波器7、C实现傅里叶变换 1、傅里叶变换 时域分析&#xff1a;以时间作为参照物&#xff0c;世间万物都是随着时间变化而变化&#xff0c;并且不会停止 频域分析&#xff1a;认为世间万…

ChatGPT论文指南|分享13个学术论文写作ChatGPT口诀!【建议收藏】

点击下方▼▼▼▼链接直达AIPaperPass &#xff01; AIPaperPass - AI论文写作指导平台 公众号原文▼▼▼▼&#xff1a; ChatGPT论文指南|分享13个学术论文写作ChatGPT口诀&#xff01;【建议收藏】 目录 1.段落转折 2.前言写作 3.具体论点 4.书籍介绍 AIPaperPass智…

day14-SpringBoot 原理篇

一、配置优先级 SpringBoot 中支持三种格式的配置文件&#xff1a; 注意事项 虽然 springboot 支持多种格式配置文件&#xff0c;但是在项目开发时&#xff0c;推荐统一使用一种格式的配置 &#xff08;yml 是主流&#xff09;。 配置文件优先级排名&#xff08;从高到低&…

并发编程之synchronized的详细解析

4.2 synchronized 解决方案 应用之互斥 为了避免临界区的竞态条件发生&#xff0c;有多种手段可以达到目的。 阻塞式的解决方案&#xff1a;synchronized&#xff0c;Lock 非阻塞式的解决方案&#xff1a;原子变量 本次课使用阻塞式的解决方案&#xff1a;synchronized&am…

可视化设计:一文读懂桑基图,从来处来,到去出去。

一、什么是桑基图 桑基图&#xff08;Sankey diagram&#xff09;是一种图表类型&#xff0c;用于可视化流量、能量、资源或数量的流动。它通过使用有向箭头连接不同的节点来显示流动的路径和量级。 桑基图常用于可持续能源、物流、人口流动、资源分配等领域的数据可视化。它…

体积小,成本低,性能好单片式集成稳压器件——D7805

D7805 构成的 5V 稳压电源为输出电压5V&#xff0c;输出电流 1000mA 的稳压电源它由滤波电容 C1,C3,防止自激电容 C2、C3 和一只固定三端稳压器&#xff08;7805&#xff09;后级加 LC 滤波极为简洁方便地搭成&#xff0c;输入直流电压范围为 7~35V&#xff0c;此直流电压经过D…

ETH网络 之 Gas

Gas&#xff08;燃料&#xff09; 我们可以把 ETH 网络 想象成一辆汽车&#xff0c;如果想运行的化就需要燃料&#xff08;Gas&#xff09; Gas Fee Gas Fee是用于执行某些操作的Gas数量 * 每单位Gas的成本 Gas Fee必须用以太坊的本币支付&#xff0c;即以太币 (ETH) Gas通常以…

unity学习(63)——预制体

1.运行发现预制体初始化的时候存在问题 这里有许多技巧&#xff0c;需要细看。 2.预制体在MapHandler.cs的定义如下 3.把MapHandler绑到相机上&#xff0c;在相机的属性栏中找到赋值部分。 4.size设置成2&#xff0c;然后把模型拖拽到1号索引位置上 5.运行之后预制体确实成功实…

机器学习 - 准备数据

“Data” in machine learning can be almost anything you can imagine. A table of big Excel spreadsheet, images, videos, audio files, text and more. 机器学习其实可以分为两部分 将不管是什么data&#xff0c;都转成numbers.挑选或者建立一个模型来学习这些numbers …

移远通信,开启透明天线中的“创新密码”

近日&#xff0c;全球领先的物联网整体解决方案供应商移远通信正式对外宣布&#xff0c;其以远远领先行业的速度推出前沿技术成果——5G透明天线。该天线主体选用透明薄膜材质&#xff0c;具有性能优、重量轻、尺寸灵活、透明度高、环境融合度好等优势&#xff0c;特别适用于智…

ideaSSM 工程车辆人员管理系统bootstrap开发mysql数据库web结构java编程计算机网页源码maven项目

一、源码特点 idea 开发 SSM 工程车辆人员管理系统是一套完善的信息管理系统&#xff0c;结合SSM框架和bootstrap完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用SSM框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统具 有完整的源代码和数据库&…

蓝桥杯练习03个人博客

个人博客 介绍 很多人都有自己的博客&#xff0c;在博客上面用自己的方式去书写文章&#xff0c;用来记录生活&#xff0c;分享技术等。下面是蓝桥云课的博客&#xff0c;但是上面还缺少一些样式&#xff0c;需要大家去完善。 准备 开始答题前&#xff0c;需要先打开本题的…

SPI读写学习

走到初衷使用STM32的地方&#xff0c;例子是读写W25Q&#xff0c;但是手上没有25Q&#xff0c;只有一个SPI接口的SD卡。在UNO上已经实验OK&#xff0c;线接好后&#xff0c;发现SD卡里有个寄存器转换表&#xff0c;跟例子的SPI接口不一样&#xff0c;要改的太多。 u32 SPI_FLAS…

修复打印机不能打印的10种方法,总有一种适合你

前言 技术有时很奇怪,我们可以用声音控制恒温器,但有时打印机会像15年前一样令人困惑和不可靠。如果打印机向你抛出错误(或完全忽略你的要求),可能有许多原因。 不幸的是,仅仅找出问题才成功一半,另一半是解决方案,它将使你的打印机重新工作。下面是如何解决问题的方…