• 第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;
    }
  • 相关阅读:
    [ASP.NET] Session 一些比较详细的知识(转自:http://blog.csdn.net/zhoufoxcn/archive/2006/11/08/1373685.aspx)
    ASP.NET2.0服务器控件之Render方法 (作者: 金属边缘 出处: 天极开发 )
    [Tip: word pdf] Word Save As PDF
    [Tip: Visual Studio]创建键盘快捷方式速查表
    [Tip: iShare Site] Move file/folder on iShare Site
    google的C++单元测试框架gtest
    XP and Win7 双系统安装教程
    Tip:How to Compact a PST File to Reduce Its Size in Outlook
    [Tip: Perforce]ModTime
    [Tool: fast copy cmd]ROBOCOPY
  • 原文地址:https://www.cnblogs.com/huangdengtao/p/11857811.html
Copyright © 2020-2023  润新知