• 第28课 友员的尴尬能力


    友元的概念
    什么是友元?
    友元是C++中的一种关系
    友元关系发生在函数与类之间或者类与类之间
    友员关系是单向的,不能传递

    友元的用法
    在类中以friend关键字声明友元
    类中的友元可以是其它类或者具体的函数
    友元不是类的一部分
    友元不受类中访问级别的限制
    友元可以直接访问具体类的所有成员

    在类中用friend关键字对函数或类进行声明
    class Point
    {
      double x;
      double y; //访问级别是private:在类的外部无法直接访问x,y(友元函数除外)

      friend void func(Point &p);//声明了一个友元函数,它不是类的成员函数。
      //该函数将两个实体联系起来了,一个是Point类,一个是func这个全局函数。
        //func这个全局函数是Point这个类的友元,进一步的说明了func这个全局函数现在拥有了友元的超能力。它就可以无限制的访问Point这个类的所有成员。
    };

    void func(Point &p)
    {

    }

    友元的使用初探

    #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)
    ", p1.getX(), p1.getY());
        printf("p2(%f, %f)
    ", p2.getX(), p2.getY());
        printf("|(p1, p2)| = %f
    ", func(p1, p2));
        
        
        return 0;
    }

    友元的尴尬
    友元是为了兼顾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
    ", 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
    ", b.n);
        }
        /*
        void getClassCName(ClassC& c)
        {
            printf("c.n = %s
    ", c.n);
        }
        */
    };
    
    int main()
    {
        ClassA A("A");
        ClassB B("B");
        ClassC C("C");
        
        A.getClassBName(B);
        B.getClassCName(C);
        
        return 0;
    }
  • 相关阅读:
    LeetCode
    <OFFER15> 15_NumberOf1InBinary
    《OFFER14》14_CuttingRope
    Convert DataFrame string complex i to j python // “Cloning” row or column vectors
    Sorting arrays in NumPy by column
    【説明する】深度优先及宽度优先算法比较
    codevs 2924 数独挑战 x(三种做法+超详细注释~)
    第四次考试大整理
    洛谷 P1048 采药
    codevs 3137-3139 栈练习 x
  • 原文地址:https://www.cnblogs.com/-glb/p/11877278.html
Copyright © 2020-2023  润新知