C++ 友元 详解

Posted on 2018-07-25

[TOC]

C++ 友元

  • C++ 用友元的方式 破坏了数据封装性
  • 把一个模块B(类或函数)申明为另一个模块A的友元之后,B就能引用访问A中隐藏的信息。可以理解为因为你是我的朋友,我的东西你就可以乱动。。。
  • 建议少使用或者不用友元

友元函数

  • 在类里申明,由 friend 修饰标明的非成员函数,也就是说即使申明在类里,一旦被扣上friend 的关键字,就不再是成员函数了。
  • 必须通过对象名访问。可访问数据成员(主要是privateprotected)。
#include<iostream>

class Point2D {

public:
    Point2D(int m_x = 0, int m_y = 0)
    {
        X = m_x;
        Y = m_y;
    }
    int FetchX() { return X; }
    int FetchY() { return Y; }
    friend double Distance(Point2D &v1, Point2D &v2);
private:
    double X, Y;
};

//注意该函数不是任何类的成员函数
double Distance(Point2D &v1, Point2D &v2) {
    double dx = v1.X -v2.X;
    double dy = v1.Y - v2.Y;
    return sqrt(dx*dx + dy*dy);
}

int main(int argc, char *argv[])
{
    Point2D p1(3, 5), p2(4, 6);

    std::cout<< "距离是: " << Distance(p1, p2)<<std::endl;
    
    std::cout << std::endl;
    system("pause");
    return 0 ;
}

友元类

  • 若类B为类A的友元。A类的所有成员都可以访问类的所有私有数据成员(privateprotected)

  • 将友元类B在A中以 friend 修饰符申明即可

    #include<iostream>
      
    class A {
      
        //friend class B;
    public:
      
        int setx(int mx)
        {
            return x = mx;
        }
    public:
    //protected:
        void Display() {
           std:: cout << "I am at A."<<std::endl;
           std::cout << x;
        }
    public:
    //private:
        int x;
    };
      
    class B {
      
    public:
        int Set(A &a);
        void Display(A &a);
      
    };
      
    int B::Set(A &a) {
        return a.x;
    }
      
    void B::Display(A &a) {
        std::cout << "I am at B." << std::endl;
        a.Display();
    }
      
      
    int main(int argc, char *argv[])
    {
        B b;
        A a;
        a.setx(100);
        b.Set(a);
        b.Display(a);
          
          
        std::cout << std::endl;
        system("pause");
        return 0 ;
    }
      
    

    可以随意把我注释的部分改一下权限,就知道怎么一回事了。

    归结起来,友元就是为了访问privateprotected成员 。

    一句话,因为你是我的朋友就可以乱动我的东西。。


蚊子再小也是肉~
本站总访问量 本站访客数