zoukankan      html  css  js  c++  java
  • C++中的友元函数

    以计算两点距离为例:

     1 class Point
     2 {
     3 public:
     4     Point()= default;
     5     Point(float x, float y) :_x(x), _y(y) {}
     6     float _x; float _y;
     7 };
     8 
     9 float cal(const Point& s1,const Point& s2)
    10 {
    11     float x = (s1._x - s2._x) * (s1._x-s2._x);
    12     float y = (s1._y - s2._y) * (s1._y-s2._y);
    13     return sqrt(x+y);
    14 
    15 }
    16 
    17 int main(int argc, char* argv[])
    18 {
    19     Point s1(1,2);
    20     Point s2(3,4);
    21     cout<<cal(s1,s2);
    22     return 0;
    23 }

    由于类Point中的函数全部是public的,所以这里并无明显错误,如果类Point的成员函数改为private则会出现问题,于是引入友元,解决方案:

     1 class Point
     2 {
     3 public:
     4     Point()= default;
     5     Point(float x, float y) :_x(x), _y(y) {}
     6 private:
     7     float _x; float _y;
     8     friend float cal(const Point& s1, const Point& s2);
     9 };
    10 
    11 float cal(const Point& s1,const Point& s2)
    12 {
    13     float x = (s1._x - s2._x) * (s1._x-s2._x);
    14     float y = (s1._y - s2._y) * (s1._y-s2._y);
    15     return sqrt(x+y);
    16 
    17 }
    18 
    19 int main(int argc, char* argv[])
    20 {
    21     Point s1(1,2);
    22     Point s2(3,4);
    23     cout<<cal(s1,s2);
    24     return 0;
    25 }

    由于外部函数不属于类,故要使得该函数与类产生关系,则需要使用friend。

    如果为这个计算函数引入一个管理类,然后使其成为该管理类的成员函数,又该如何,解决如下:

    class Point;
    class Manage
    {
    public:
        Manage() = default;
        float cal(const Point& s1, const Point& s2);
    
    };
    class Point
    {
    public:
        Point()= default;
        Point(float x, float y) :_x(x), _y(y) {}
    private:
        float _x; float _y;
        friend float Manage::cal(const Point& s1, const Point& s2);
    };
    float Manage::cal(const Point& s1, const Point& s2)
    {
        float x = (s1._x - s2._x) * (s1._x - s2._x);
        float y = (s1._y - s2._y) * (s1._y - s2._y);
        return sqrt(x + y);
    
    }
    
    int main(int argc, char* argv[])
    {
        Point s1(1,2);
        Point s2(3,4);
        Manage a;
        cout<<a.cal(s1,s2);
        return 0;
    }

    说明:

    类的前向声明只能说明这是一个类,但是它的大小以及其他属性一无所知,故只能用于函数的形参、引用及指针。

  • 相关阅读:
    tableviewCell折叠状态1
    iOS中--NSArray调用方法详解 (李洪强)
    NSNumber的使用
    Fedora13下编译busybox-1.15.0出现can not find lcrypt错误
    【独立开发人员er Cocos2d-x实战 013】Cocos2dx 网络编程实战之星座运势
    JAVA序列化的作用
    我买网B轮融资成功,五周年豪掷千万回馈会员
    一步步教你搭建TinyOS2.1.2开发环境
    POJ2947 DAZE [Gauss]
    慢慢理解RESTful架构
  • 原文地址:https://www.cnblogs.com/SunShine-gzw/p/15430207.html
Copyright © 2011-2022 走看看