C++友元如何使用

发布时间:2022-04-24 10:53:39 作者:iii
来源:亿速云 阅读:122

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

一、友元的概念

C++友元如何使用

二、友元的用法

三、友元的语法

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

C++友元如何使用

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

#include <stdio.h>
#include <math.h>
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;
}

输出结果如下:

C++友元如何使用

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

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

#include <stdio.h>
#include <math.h>
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++友元如何使用

四、友元的尴尬

五、注意事项

C++友元如何使用

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

#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\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 的友元,输出结果如下:

C++友元如何使用

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

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

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

C++友元如何使用

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

推荐阅读:
  1. C++语言学习(七)——友元
  2. 细说C++的友元

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

c++

上一篇:vue如何axios整合使用

下一篇:vue3中props组件抽离的方法

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》