发布网友 发布时间:2022-04-01 16:06
共3个回答
热心网友 时间:2022-04-01 17:36
可以 将前类定义为后类的友元类即可
定义
友元函数是可以直接访问类的私有成员的非成员函数。它是定义在类外的普通函数,它不属于任何类,但需要在类的定义中加以声明,声明时只需在友元的名称前加上关键字friend。
定义格式(c++)
friend<返回类型><函数名>(<参数列表>);
问题提出
我们已知道类具有封装和信息隐藏的特性。只有类的成员函数才能访问类的私有成员,程序中的其他函数是无法访问私有成员的。非成员函数可以访问类中的公有成员,但是如果将数据成员都定义为公有的,这又破坏了隐藏的特性。另外,应该看到在某些情况下,特别是在对某些成员函数多次调用时,由于参数传递,类型检查和安全性检查等都需要时间开销,而影响程序的运行效率。
为了解决上述问题,提出一种使用友元的方案。友元是一种定义在类外部的普通函数,但它需要在类体内进行说明,为了与该类的成员函数加以区别,在说明时前面加以关键字friend。友元不是成员函数,但是它可以访问类中的私有成员。友元的作用在于提高程序的运行效率,但是,它破坏了类的封装性和隐藏性,使得非成员函数可以访问类的私有成员。
友元可以是一个函数,该函数被称为友元函数;友元也可以是一个类,该类被称为友元类。
友元类
友元除了前面讲过的函数以外,友元还可以是类,即一个类可以作另一个类的友元。当一个类作为另一个类的友元时,这就意味着这个类的所有成员函数都是另一个类的友元函数。
例如,以下语句说明类B是类A的友元类:
classA
{
…
public:
friendclassB;
…
};
经过以上说明后,类B的所有成员函数都是类A的友元函数,能存取类A的私有成员和保护成员。
使用友元类时注意:
(1)友元关系不能被继承。
(2)友元关系是单向的,不具有交换性。若类B是类A的友元,类A不一定是类B的友元,要看在类中是否有相应的声明。
(3)友元关系不具有传递性。若类B是类A的友元,类C是B的友元,类C不一定是类A的友元,同样要看类中是否有相应的申明
友元函数
友元函数的特点是能够访问类中的私有成员的非成员函数。友元函数从语法上看,它与普通函数一样,即在定义上和调用上与普通函数一样。下面举一例子说明友元函数的应用。
#include
#include
usingnamespacestd;
classPoint
{
public:
Point(doublexx,doubleyy){x=xx;y=yy;}
voidGetxy();
frienddoubleDistance(Point&a,Point&b);
private:
doublex,y;
};
voidPoint::Getxy()
{
cout<<"("<<<","<<<")"<
}
doubleDistance(Point&a,Point&b)
{
doubledx=a.x-b.x;
doubledy=a.y-b.y;
returnsqrt(dx*dx+dy*dy);
}
voidmain()
{
Pointp1(3.0,4.0),p2(6.0,8.0);
p1.Getxy();
p2.Getxy();
doubled=Distance(p1,p2);
cout<<"Distanceis"<<
}
说明:在该程序中的Point类中说明了一个友元函数Distance(),它在说明时前边加friend关键字,标识它不是成员函数,而是友元函数。它的定义方法与普通函数定义一样,而不同于成员函数的定义,因为它不需要指出所属的类。但是,它可以引用类中的私有成员,函数体中a.x,b.x,a.y,b.y都是类的私有成员,它们是通过对象引用的。在调用友元函数时,也是同普通函数的调用一样,不要像成员函数那样调用。本例中,p1.Getxy()和p2.Getxy()这是成员函数的调用,要用对象来表示。而Distance(p1,p2)是友元函数的调用,它直接调用,不需要对象表示,它的参数是对象。(该程序的功能是已知两点坐标,求出两点的距离。)
热心网友 时间:2022-04-01 18:54
#include <iostream>
using namespace std;
class B //把B类放前面定义
{
private:
int c;
public:
void display();
};
class A
{
private:
int a;
void display()
{
cout<<"a="<<a<<endl;
}
public:
A(int b) //构造函数是有参数的
{
a=b;
}
friend void B::display();
};
void B::display()
{
A aa(1); //给个参数
aa.display(); //调用成员函数要A类的对象来调用
cout<<"this is class b"<<endl;
}
void main()
{
A a(2); //缺个参数
B b;
b.display();
}
热心网友 时间:2022-04-01 20:28
友元函数:
作用:把其他类中函数作为自己的友员成员函数,让特定的类成员成为另一个类的友元函数,而不必让整个类成为友元,但在使用时,必须小心排列各种声明和定义顺序(且需用到向前声明)
。
但是我觉得不能让一个类的构造函数,成为另一个类的友元函数。
理由:
第一:即使能行,这件事本身也没有任何的意义。类本身就有构造函数,为什么还要定义其他类的构造函数呢?
第二:会导致代码阅读障碍吧。
有元函数的目的是只使用其他类的某个函数,而不必让整个类为友元。功能才是主要目的吧。
我是这么理解的,如果有不对的地方请多指教。