zoukankan      html  css  js  c++  java
  • 第28课.友元的尴尬能力

    1.友元的概念

    a.友元是c++中的一种关系
    b.友元关系发生在函数与类之间或者类与类之间
    c.友元关系是单项的,不能传递(充分不必要)

    2.友元的用法

    a.在类中以friend关键字声明友元
    b.类的友元可以是其它类或具体函数
    c.友元不是类的一部分(函数,是外界的。类就不用说了。)
    d.友元不受类中访问级别的限制(private;public)
    e.友元可以访问具体类的所有成员

    #include <stdio.h>
    
    class Point
    {
        double x;
        double y;
        
        friend void func(Point &p);        
    };
    
    void func(Point &p)
    {
    }
    

    3.友元的的尴尬

    a.友元是为了兼顾c预言的高效性而诞生的
    b.友元直接破坏了面向对象的封装性
    c.友元在时间产品中的搞笑是得不偿失的
    d.友元在现代软件工程中已经渐渐被遗弃
    4.注意事项:

    a.友元关系不具备传递性
    b.友元可以是其它类的成员函数
    c.类的友元可以是某个完整的类(友元类的所有成员函数都是另一个类的友元函数,分别于类友元,友元关系不能被继承

    eg:
    函数与类之间的友元:

    #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;
    }
    

    类与类之间的友元:

    #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;
    }
  • 相关阅读:
    【面积并】 Atlantis
    【动态前k大 贪心】 Gone Fishing
    【复杂枚举】 library
    【双端队列bfs 网格图建图】拯救大兵瑞恩
    【奇偶传递关系 边带权】 奇偶游戏
    【权值并查集】 supermarket
    CF w4d3 A. Pythagorean Theorem II
    CF w4d2 C. Purification
    CF w4d2 B. Road Construction
    CF w4d2 A. Cakeminator
  • 原文地址:https://www.cnblogs.com/huangdengtao/p/11857811.html
Copyright © 2011-2022 走看看