精华内容
下载资源
问答
  • 友元函数

    2018-09-26 17:16:14
    二、友元函数特点友元函数不是当前类的成员函数,但它可以访问该类的所有成员,包括私有成员、保护成员和公有成员。 友元函数可以定义在类内,也可以定义在类外。 三、友元函数的分类 1、将非成员函数声明...

    对友元函数和友元类进行了一些整理:

    一、关于友元函数的定义:

    友元函数可以是不属于任何类的非成员函数,也可以是另一个类的成员函数。

    二、友元函数的特点:

    友元函数不是当前类的成员函数,但它可以访问该类的所有成员,包括私有成员、保护成员和公有成员。

    友元函数可以定义在类内,也可以定义在类外。

    三、友元函数的分类

    1、将非成员函数声明为友元函数

    #include <iostream>
    using namespace std;
    class Date{
    public:
    Date (int y,int m,int d);
    friend void showDate(Date&);  //声明函数showDate为友元函数
    
    }
    ...
    Void showDate (Date& d)
    {
    ...
    }
    ...
    

    这时友元函数的访问原则是:友元函数不是类的成员函数,所以不能直接访问对象的数据成员,必须通过对象名来访问该对象的数据成员。

    引友元提高了程序的运行效率,实现了类之间的数据共享,方便编程。

    2、将成员函数声明为友元函数

    一个类的成员函数也可以作为另一个类的友元,成为友元成员函数。友元成员函数不仅可以访问自己所在类对象中的私有和公有成员,还可以访问访问friend声明语句所在类对象中的成员。

    #include<iostream>
    using namespace std;
    class Time {
    public:
    ...
    void showDate_Time(Date&);
    ...
    
    }
    class Date{
    public:
    Date(int y,int m, int d)
    ...
    friend void Time :: showDate_Time (Date&);
    }
    
    void Time::showDate_Time (Date& d)
    {
    
    }
    //友元函数,函数showDate_Time 可以访问Date类对象中的私有成员数据
    //成员函数,函数showDate_Time 可以访问Time类对象中的私有数据

    四、友元类

    定义:将一个类定义为也可以定义为友元类

    如:在X类中加入friend Y类,则这时的Y类就是X类的友元类

    这意味着Y类中的所有函数都可以访问X类中的所有成员(包括私有成员)

    注意:(1)友元关系是单向的,不具有交换性。如声明了类X是类Y的友元,不等于类Y一定是X的友元。

    (2)友元不具有传递性,若类X是类Y的友元,类Y是类Z的友元,不一定类X是类Z的友元。必须在类Z中声明。

    展开全文
  • 友元函数的优缺点

    千次阅读 2020-06-29 17:49:17
    为什么要使用友元函数 在实现类之间数据共享时,减少系统开销,提高效率。如果类A中的函数要访问类B中的成员(例如:智能指针类的实现),那么类A中该函数要是类B的友元函数。具体来说:为了使其他类的成员函数直接...

    为什么要使用友元函数

    在实现类之间数据共享时,减少系统开销,提高效率。如果类A中的函数要访问类B中的成员(例如:智能指针类的实现),那么类A中该函数要是类B的友元函数。具体来说:为了使其他类的成员函数直接访问该类的私有变量。即:允许外面的类或函数去访问类的私有变量和保护变量,从而使两个类共享同一函数。
    实际上具体大概有下面两种情况需要使用友元函数:(1)运算符重载的某些场合需要使用友元。(2)两个类要共享数据的时候。

    使用友元函数的优缺点
    优点:能够提高效率,表达简单、清晰。
    缺点:友元函数破环了封装机制,尽量不使用成员函数,除非不得已的情况下才使用友元函数。

    展开全文
  • 一、友元函数友元函数是一种特殊的函数,它需要在类体内进行说明,可以访问类的私有成员和保护成员,但又不是类的成员函数。友元函数的说明如下:friend 数据类型函数名(参数)其中,friend是说明友元函数的关键字,...

    af418581e80ee46ab8edbe9e564d37f7.png

    一、友元函数

    友元函数是一种特殊的函数,它需要在类体内进行说明,可以访问类的私有成员和保护成员,但又不是类的成员函数。友元函数的说明如下:

    friend 数据类型函数名(参数)

    其中,friend是说明友元函数的关键字,友元声明可以出现在类中的任何地方。通常,将友元声明成组地放在类定义的开始或结尾是个好主意。归纳起来,友元函数是一种能够访问类中私有成员的非类成员函数,友元函数在定义上和调用上与普通函数一样。友元的作用在于提高程序的运行效率,但是,它破坏了类的封装性和隐藏性,使得非成员函数可以访问类的私有成员。因此,只有在十分需要的时候才使用友元函数。 例如:分析下面程序的输出结果

    #include

    #include

    using namespace std;

    class TPoint

    {

    private:

    double x,y; //私有数据成员

    public:

    TPoint(double a,double b) //构造函数

    {

    x=a,y=b;

    cout<

    }

    friend double distanceoftwopoints(TPoint &a, TPoint &b) //友元函数

    {

    return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));

    }

    } ;

    int main()

    {

    TPoint p1(2,2),p2(5,5);

    cout<

    return 0;

    }

    上述程序中,distaceoftwopoints()是类TPoint的友元函数,在其中可以直接使用a.x等,由于x等是类TPoint的私有成员,所以在普通函数中是不能这么使用的,但是在友元函数中则可以。下面是该程序的输出。

    9eb52dbc6d53aaa00fbc7ec25e70b006.gif

    友元函数的一个重要特点是它可以是多个类的友元。例如,编写一个程序,求一个点到直线的距离。设计一个点类Point,它有两个私有数据成员x和y,表示点的坐标。另一个类为直线类Line,它有三个私有数据成员a,b和c,表示直线方程ax+by+c=0。这两个类中都说明了一个友元函数dist,用于计算一个点到直线的距离。点(x,y)到直线ax+by+c=0的距离d的计算公式如为:d=abs((ax+by+c)/sqrt(a* a+b*b)),其中abs是求绝对值函数,sqrt是求平方根函数。代码如下:

    #include

    #include

    using namespace std;

    class Line;//提前说明

    class Point

    {

    int x,y;

    public:

    Point(int x1,int y1)

    {

    x=x1; y=y1;

    }

    friend double dist(Line l, Point p);//友元函数说明

    } ;

    class Line

    {

    int a,b,c;

    public:

    Line(int a1, int b1, int c1)

    {

    a=a1; b=b1; c=c1;

    }

    friend double dist(Line l, Point p);//友元函数说明

    };

    double dist(Line l, Point p)//注意:类内已经说明,因此函数前不要加friend

    {

    double d;

    d = abs(l.a*p.x+l.b*p.y+l.c)/(sqrt(l.a*l.a+l.b*l.b));

    return d;

    }

    int main()

    {

    Point p(10,10);

    Line l(2,4,-3);

    cout<

    return 0;

    }

    下面是该程序的输出结果:上述程序中有两个类Point和Line,它们都说明了同一个友元函数:friend double dist(Line l, Point p)。由于在Point类中说明时尚未定义类Line,所以需要在前面用class Line语句进行提前说明。该程序的执行如下:

    7726b4b19e263c1a9b9b5b9a1a301c63.gif

    一个类A的成员 函数f()可以作为另一个类B的友元函数,在这种情况下,必须先定义A类,并且在B类中说明友元函数f()时,要加上成员函数所在类的类名,即:

    class A

    {

    ...

    数据类型 f(参数表)

    ...

    }

    class B

    {

    ...

    friend 数据类型 A::f(参数表);

    ...

    }

    数据类型 A::f(参数表)

    {

    函数体;

    }二、友元类

    除了前面所讲过的友元函数外,友元还可以是一个类,即一个类可以作为另一个类的友元。当一个类作为另外一个类的友元时,就意味着这个类的所有成员函数都是另一个类的友元函数。例如,以下程序说明类B是类A的友元类:

    class A

    {

    ...

    Public:

    friend class B;//说明B是A的友元类

    ...

    }

    例如,有如下程序

    #include

    #include

    using namespace std;

    class A

    {

    int x;

    public:

    A() {x=5;}

    friend class B;//说明B是A的友元类

    };

    class B

    {

    public:

    void disp1(A tmp){

    tmp.x++;

    cout<

    }

    void disp2(A tmp){

    tmp.x--;

    cout<

    }

    };

    int main()

    {

    A obj1;

    B obj2;

    obj2.disp1(obj1);

    obj2.disp2(obj1);

    return 0;

    }

    }

    上述程序中,类B是类A的友元类,类B包括两个成员函数,这两个成员函数可以当成类A自己的友元函数一样使用,该程序执行结果如下:

    788942a6c8886aec9b819f8790eb4d9b.gif

    友元类的所有成员函数都是另一个类的友元函数,都可以访问另一个类中的隐藏信息(包括私有成员和保护成员)。当希望一个类可以存取另一个类的私有成员时,可以将该类声明为另一类的友元类。关于友元类的注意事项:(1)友元关系不能被继承。(2)友元关系是单向的,不具有交换性。若类B是类A的友元,类A不一定是类B的友元,要看在类中是否有相应的声明。(3)友元关系不具有传递性。若类B是类A的友元,类C是B的友元,类C不一定是类A的友元,同样要看类中是否有相应的申明。

    三、习题解析

    1.一个类的友元函数能够访问该类的( )。A.私有成员 B.保护成员 C.公有成员 D.所有成员

    解析:一个类的友元函数对类成员的访问能力等同于类的成员函数,即能访问类的所有成员,选D。

    2.下列的各类函数中,( )不是类的成员函数。A、 构造函数 B、析构函数 C、友元函数 D、拷贝初始化构造函数

    答案:C

    3.下列关于友元的描述中,错误的是( )A.友元函数可以访问该类的私有数据成员B.一个类的友元类中的成员函数都是这个类的友元函数C.类与类之间的友元关系可以继承D.友元可以提高程序的运行效率

    解析:友元关系是不能被继承的,并且是单向的,不可交换的。

    4.下列程序利用友元函数求2个点的距离,找出存在的错误(有2个错)。

    #include

    #include

    class Tpoint

    { double x,y;

    public:

    Tpoint(double a,double b)

    { x=a; y=b; }

    friend double distance(Tpoint &, Tpoint &);

    };

    double Tpoint::distance(Tpoint &p1,Tpoint &p2)

    { double dist;

    dist=sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));

    return dist;

    }

    int main()

    { Tpoint p1(2,2),p2(5,6);

    cout<

    return 0;

    }四、小结

    在需要允许某些特定的非成员函数访问一个类的私有成员(及受保护成员),而同时仍阻止一般的访问的情况下,友元是可用的。

    优点:可以灵活地实现需要访问若干类的私有或受保护的成员才能完成的任务;便于与其他不支持类概念的语言(如C语言、汇编等)进行混合编程;通过使用友元函数重载可以更自然地使用C++语言的IO流库,便于实现运算符的重载等功能。

    缺点:一个类将对其非公有成员的访问权限授予其他函数或者类,会破坏该类的封装性,降低该类的可靠性和可维护性。

    参考书目

    《C++ Primer》,《C++语言习题与解析》等

    展开全文
  • 在c++中,经常会定义类。类有一个特点就是数据封装数据...使用友元函数将百分制学生的成绩转换成相应的分数等级。 #include<iostream> using namespace std; #include<iomanip> #include<string.h>

    在c++中,经常会定义类。类有一个特点就是数据封装数据隐藏,也就是该类的私有成员以及保护成员只有通过它的成员才能访问。通过中的友元机制则解决了这一问题。友元既可以是独立的一个非成员函数,也可以是其他类中的成员函数,还可以一个独立的其他类。
    一.非成员函数作为友元函数。
    使用友元函数将百分制学生的成绩转换成相应的分数等级。

    #include<iostream>
    using namespace std;
    #include<iomanip>
    #include<string.h>
    class student{
    	private:
    		char name[20];
    		int score;
    		char level[10];
    		public:
    			student(char na[],int sc);//构造函数
    			friend void trans(student &s);
    			void print()
    			{
    				cout<<setw(10)<<name<<setw(8)<<score<<setw(6)<<level<<endl;
    			}
    		
    }; 
    
    student::student(char na[],int sc)//构造函数 
    {
        strcpy(name,na);
    	score=sc;
    }
    void trans(student &s);
    int main()
    {
    	student stu[]={student("小红",78),student("王华",86),student("李明",98),student("孙强",62)};
    	cout<<"输出结果:"<<endl;
    	cout<<setw(10)<<"姓名"<<setw(8)<<"成绩"<<setw(6)<<"等级"<<endl; 
    	for(int i=0;i<4;i++)
    	{
    		 trans(stu[i]);
    		 stu[i].print();
    	}
    	return 0;
     } 
     void trans(student &s)
     {
     	if(s.score>90)
     	strcpy(s.level,"优");
    	 else if(s.score>=80)
    	 strcpy(s.level,"良");
    	 else if(s.score>=70)
    	 strcpy(s.level,"中");
    	 else if(s.score>=60)
    	 strcpy(s.level,"及格") ;
    	 else
    	 strcpy(s.level,"不及格"); 
     }
     
     
    

    strcpy为字符串复制函数,需定义在头文件 string.h 中。
    注意:
    1.非成员函数作为类的友元函数在类外定义,不能在函数名外加"类名::函数名"
    2.非成员函数作为类的友元函数,没有this指针

    展开全文
  • 友元函数特点是能够访问类中的私有成员的非成员函数。友元函数从语法上看,它与普通函数一样,即在定义上和调用上与普通函数一样
  • 1.运算符重载定义: C++中预定义的运算符的操作对象只能是基本数据类型。但实际上,对于许多用户自定义类型(例如类),也需要类似的运算操作。这时就必须在C++中重新定义...运算符重载的实质是函数重载,它提供...
  • 1)公有继承纯虚函数 => 继承的是:接口 (interface)普通虚函数 => 继承的是:接口 + 缺省实现 (default implementation)非虚成员函数 =>继承的是:接口 + 强制实现 (mandatory implementation)2) 不要重新...
  • C++类的友元函数

    2019-02-27 14:56:49
    友元函数是类的辅助手段,友元能够引用类中本来被隐蔽的信息。 使用友元的目的是基于程序的运行效率。 一般运算符重载和两个类共享数据这两个场合需要使用友元。 友元可以是函数,也可以是类,...
  • 友元函数的三种实现方式

    千次阅读 2018-11-30 10:16:12
    1.为什么要使用友元函数 在实现类之间数据共享时,减少系统开销,提高效率。如果类A中的函数要访问类B中的成员(例如:智能指针类的实现),那么类A中该函数要是类B的友元函数。具体来说:为了使其他类的成员函数...
  • 友元函数和友元类

    2018-05-05 15:33:49
    友元函数的引入:类的主要特点之一是信息隐藏和封装,即类的私有成员(或者保护成员)只能在类定义的范围内使用,只允许本类的成员函数来调用,但是有时候也需要在类外引用私有成员(或者保护成员);那么问题就是...
  • 重载运算符与友元函数

    千次阅读 2017-08-30 21:26:51
    本次博客 主要学习运算符重载和友元函数。其中 运算符重载能够将平时用于内置类型的变量的操作符(如+,-,*,/等)用于类对象; 友元这种C++机制使得非成员函数可以访问私有数据。
  • 简述友元函数、友元类? (1)友元函数 友元函数不是类的成员函数,而是类的外部函数。友元函数可以访问该类的私有成员。 (2)友元类 和友元函数类似。如将类A声明为类B的友元类,那么类A就可以访问类B的私有...
  • 友元函数与友元类的声明与使用

    千次阅读 2017-09-03 17:40:21
    1.友元函数的简单介绍 1.1为什么要使用友元函数 在实现类之间数据共享时,减少系统开销,提高效率。如果类A中的函数要访问类B中的成员(例如:智能指针类的实现),那么类A中该函数要是类B的友元函数。具体来...
  • 使用友元函数重载运算符

    千次阅读 2018-10-05 21:41:01
    1. 声明友元函数能让非类内的成员函数访问到类内的私有数据成员   2. 为什么要用友元函数来重载运算符?  首先如果是在类内重载的运算符函数,都默认有一个 *this 指针,所以此时对二元运算符重载的话只能放一...
  • C++: 友元函数和友元类详解

    千次阅读 2016-07-17 22:40:42
    (1) 友元关系不能被继承。 (2) 友元关系是单向的,不具有交换性。若类B是类A的友元,类A不一定是类B的友元,要看在类中是否有相应的声明。 (3) 友元关系不具有传递性。若类B是类A的友元,类C是B的友元,类C不一定...
  • c++(友元函数,静态成员)

    千次阅读 2018-06-15 08:59:35
    友元函数并不是类中的一个成员(1)注意:a、友元函数可访问类的私有成员,但不是类的成员函数b、友元函数不能用const修饰c、友元函数可以在类定义的任何地方声明(除了在函数体内),不受类访问限定符限制(不是类...
  • C/C++——友元函数

    2015-11-24 14:04:48
    本文简单介绍了友元函数及使用方式,友元函数是一种独特的函数,可以访问类中的private变量,通过程序示例说明了和普通函数的不同点。
  • 面试的时候面试官问到了友元函数,自己其实之前对友元函数不是特别熟悉,只是略知一二;当然,回答的不是很让面试官满意,今天总体的再学习一下友元函数。 1.什么是友元函数特点: ①在类中声明的以friend关键字...
  • 友元函数是成员函数,它被说明在类体内 //友元函数不是成员函数,但要在类中声明 B.友元函数可直接访问类中的私有成员 C.友元函数破坏封装性,使用时尽量少用 D.友元类中的所有成员函数都是友元函数 2.下面对于...
  • C++ friend友元函数、友元类详解及完整例程 0. 综述 C++中的友元机制允许类的非公有成员被一个类或者函数访问,友元按类型分为三种: 普通非类成员函数作为友元, 类的成员函数作为友元, 类作为友元。 **友元...
  • 友元可以是一个函数,该函数被称为友元函数;友元也可以是一个类,该类被称为友元类...友元函数特点是能够访问类中的私有成员的非成员函数。友元函数从语法上看,它与普通函数一样,即在定义上和调用上与普通函数一样
  • c++运算符重载和友元函数

    千次阅读 2014-04-20 21:03:49
    1.运算符重载:例如+本来是用于两个整数或者两个浮点数进行相加的,如果我将+重载之后,可将+用于时间对象的相加,比如一个时间对象为1小时...只需要在operator后加上运算符号作为函数名即可: class Time { private:
  • 友元(友元函数、友元类、类成员函数的友元) (friend)友元机制:允许一个类将对其非公有成员的访问权限授予指定的函数或者类。 我们可以将友元大致分为3类: 友元函数 友元类 类成员函数的友元 一:友元...
  • 如果在某个类的定义中用friend声明了一个外部函数(或者是其他类的成员函数,既可以是public型,也可以是private型)后,这个外部函数称为类的友元函数。 C++提供一种允许外部类和函数存取类的私有成员和保护成员的...
  • 友元函数 一个常规的成员函数声明描述了三件在逻辑上相互不同的事情 1. 该函数能访问类声明的私用部分 2. 该函数位于类的作用域之中 3. 该函数必须经由一个对象去激活(有一个this指针)   通过将函数声明为...
  • 问题描述:定义boat和Car两个类,二者都有weight属性,定义二者的一个友元函数getTotalWeight( ),计算二者对象的重量和 #include <iostream> using namespace std; class cat; class boat{ private: ...
  • 静态成员与友元函数

    千次阅读 2016-01-22 21:50:19
    1、静态成员  由来:使用全局对象实现数据共享,... 特点:静态数据成员属于类,而不属于某个对象独有,类的所有对象共享静态数据成员  静态数据成员使用关键字static,在类体中声明,在类体外定义,以分配存储

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,619
精华内容 2,647
关键字:

友元函数特点