千家信息网

C++友元如何使用

发表于:2024-10-19 作者:千家信息网编辑
千家信息网最后更新 2024年10月19日,本文小编为大家详细介绍"C++友元如何使用",内容详细,步骤清晰,细节处理妥当,希望这篇"C++友元如何使用"文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、友元的概念什么
千家信息网最后更新 2024年10月19日C++友元如何使用

本文小编为大家详细介绍"C++友元如何使用",内容详细,步骤清晰,细节处理妥当,希望这篇"C++友元如何使用"文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

一、友元的概念

  • 什么是友元?

  • 友元是 C++ 中的一种关系

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

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

二、友元的用法

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

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

  • 友元不是类的一部分

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

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

三、友元的语法

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

先看一个不使用友元的代码:

#include #include class Point{    double x;    double y;public:    Point(double x, double y)    {        this->x = x;        this->y = y;    }    double getX()    {        return x;    }    double getY()    {        return y;    }    //friend double func(Point& p1, Point& p2);};double func(Point& p1, Point& p2){    double ret = 0;    ret = (p2.getY() - p1.getY()) * (p2.getY() - p1.getY()) +          (p2.getX() - p1.getX()) * (p2.getX() - p1.getX());    ret = sqrt(ret);    return ret;}int main(){    Point p1(1, 2);    Point p2(10, 20);    printf("p1(%f, %f)\n", p1.getX(), p1.getY());    printf("p2(%f, %f)\n", p2.getX(), p2.getY());    printf("|(p1, p2)| = %f\n", func(p1, p2));    return 0;}

输出结果如下:

这个程序在x 和 y中计算两点之间的距离时需要频繁访问私有成员 x 和 y,所以不得不调用getX() 和getY() 来访问x 和 y,x 和 y 函数中调用了 8 次getX() 和getY(),很麻烦。

这个时候,就该我们的友元上场了:

#include #include class Point{    double x;    double y;public:    Point(double x, double y)    {        this->x = x;        this->y = y;    }    double getX()    {        return x;    }    double getY()    {        return y;    }    friend double func(Point& p1, Point& p2);};double func(Point& p1, Point& p2){    double ret = 0;    ret = (p2.y - p1.y) * (p2.y - p1.y) +          (p2.x - p1.x) * (p2.x - p1.x);    ret = sqrt(ret);    return ret;}int main(){    Point p1(1, 2);    Point p2(10, 20);    printf("p1(%f, %f)\n", p1.getX(), p1.getY());    printf("p2(%f, %f)\n", p2.getX(), p2.getY());    printf("|(p1, p2)| = %f\n", func(p1, p2));    return 0;}

输出结果如下:

四、友元的尴尬

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

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

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

  • 友元在现代软件工程中已经逐渐被遗弃

五、注意事项

  • 友元关系不具备传递性

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

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

  • 所有的成员函数都是友元

下面来深入分析一下友元:

#include 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\n", 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\n", b.n);    }    /*    void getClassCName(ClassC& c)    {        printf("c.n = %s\n", c.n);    }    */};int main(){    ClassA A("A");    ClassB B("B");    ClassC C("C");    A.getClassBName(B);    B.getClassCName(C);    return 0;}

B 是 C 的友元,A 是 B 的友元,输出结果如下:

既然 A 可以访问 B,B 可以访问 C,那么 A 可以访问 C 么?把上面代码取消注释:

  void getClassCName(ClassC& c)  {        printf("c.n = %s\n", c.n);  }

输出报错,这说明友元关系不具备传递性

读到这里,这篇"C++友元如何使用"文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注行业资讯频道。

函数 c.n C++ 成员 输出 之间 文章 结果 代码 关键 关键字 其它类 内容 b.n 妥当 频繁 尴尬 得不偿失 中用 事项 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 移动安全服务器连接不上 中国有几大互联网科技公司 数据库表sql不运行的方法 魔兽世界怀旧服部落最新服务器 木兰软件开发者 四川政府的征信数据库的功能 远离网络安全上网班会 服务器存储浪是什么意思 如何查询染色体异常数据库 陕西回收服务器主板云空间 番禺区网络安全宣传活动 免费下载软件开发费哪里来 重庆软件开发平均工资 大型mmo游戏的服务器 县广播电视网络安全岗位职责 佛山商城软件开发联系方式 Linux怎么看pg数据库 软件开发的版本号 数据库技术员及应用实训报告 广西软件开发定制 软件开发工作周报模板下载 无限法则开启新服务器 CCCD结直肠癌数据库 数据库 导入 非常慢 柳州网络安全工程师培训机构 事务型数据库就是关系型数据库 数据库系统原理讲解 软件开发活动策划书 数据库怎么提高查询总行数 软件开发服务做什么科目
0