友元函数在定义和调用上与普通函数一样,不同于成员函数的定义,它不需要指出所属的类。
#include<iostreamh>
class Point
{
public:
Point(double xx,double yy)
{x=xx,y=uu;}
void Getxy();
friend double Distance(Point &a,Point &b);
private:
double x,y;
};
void Point::Getxy()
{ cout<<"("<<x<<","<<y<<")"<<endl;
}
double Distance(Point &a,Point&b)
{ double dx=ax-bx;
double dy=ay-by;
double sqrt(dxdy+dydy);
}
void main()
{ Point p1(30,40),p2(60,80);
p1Getxy();
p2Getxy();
double d=Distance(p1,p2);
cout<<"Distance is"<<d<<endl;
}
结果:
(30,40)
(60,80)
Distance is 5
友元函数是可以直接访问类的私有成员的非成员函数。它是定义在类外的普通函数,它不属于任何类,但需要在类的定义中加以声明,声明时只需在友元的名称前加上关键字friend,其格式如下:
friend 类型 函数名(形式参数);
友元函数的声明可以放在类的私有部分,也可以放在公有部分,它们是没有区别的,都说明是该类的一个友元函数。 一个函数可以是多个类的友元函数,只需要在各个类中分别声明。 友元函数的调用与一般函数的调用方式和原理一致。
:使用说明
1、友元函数是类外函数,声明可以放在类的私有或者公有,且都没有区别;
2、直接调用友元函数不需要通过对象或者指针;
3、友元函数没有this指针,且不能被继承;
4、友元函数声明形式 friend + 普通函数声明。
参考资料:
问题一:友元函数有什么作用,它主要用在哪些情况下 定义格式(c++):
friend ();
分清成员函数,非成员函数和友元函数
成员函数和非成员函数最大的区别在于成员函数可以是虚拟的而非成员函数不行。所以,如果有个函数必须进行动态绑定(见条款38),就要采用虚拟函数,而虚拟函数必定是某个类的成员函数。关于这一点就这么简单。如果函数不必是虚拟的,情况就稍微复杂一点。 (条款38: 决不要重新定义继承而来的缺省参数值)
举例
看下面表示有理数的一个类:
class rational {
public:
rational(int numerator = 0, int denominator = 1);
int numerator() const;
int denominator() const;
private:
};
这是一个没有一点用处的类。(用条款18的术语来说,接口的确最小,但远不够完整。)所以,要对它增加加,减,乘等算术 *** 作支持,但是,该用成员函数还是非成员函数,或者,非成员的友元函数来实现呢?
当拿不定主意的时候,用面向对象的方法来考虑!有理数的乘法是和rational类相联系的,所以,写一个成员函数把这个 *** 作包到类中。
class rational {
public:
const rational operator(const rational& rhs) const;
};
(如果你不明白为什么这个函数以这种方式声明――返回一个const值而取一个const的引用作为它的参数――参考条款21-23。)
条款21: 尽可能使用const
条款22: 尽量用“传引用”而不用“传值”
条款23: 必须返回一个对象时不要试图返回一个引用
现在可以很容易地对有理数进行乘法 *** 作:
rational oneeighth(1, 8);
rational onehalf(1, 2);
rational result = onehalf oneeighth; 运行良好
result = result oneeighth; 运行良好
但不要满足,还要支持混合类型 *** 作,比如,rational要能和int相乘。但当写下下面的代码时,只有一半工作:
result = onehalf 2; 运行良好
result = 2 onehalf; 出错!
这是一个不好的苗头。记得吗?乘法要满足交换律。
如果用下面的等价函数形式重写上面的两个例子,问题的原因就很明显了:
result = onehalfoperator(2); 运行良好
result = 2operator(onehalf); 出错!
对象onehalf是一个包含operator函数的类的实例,所以编译器调用了那个函数。而整数2没有相应的类,所以没有operator成员函数。编译器还会去搜索一个可以象下面这样调用的非成员的operator函数(即,在某个可见的名字空间里的operator函数或全局的operator函数):
result = operator(2, onehalf); 错误!
但没有这样一个参数为int和rationa>>
问题二:c++中 友元函数 是什么,有什么用 某些不是类方法的函数如果需要访问类的私有成员就可以把这个函数声明为这个类的友元函数, 只是可以让类外头的函数访问类的私有变量而已, 觉得能用到就用, 虚函数是多态时用到的东西和友元没什么关系
问题三:在C++中,为什么要使用到友元函数呢有什么好处呢?能否举个例子 友元函数是指某些虽然不是类成员却能够访问类的所有成员的函数。。类授予它的友元特别的访问权。通常同一个开发者会出于技术和非技术的原因,控制类的友元和成员函数(否则当你想更新你的类时,还要征得其它部分的拥有者的同意)。
举个通俗的例子吧,
一个家庭,对一般的访客开发的是客厅,厨房等,但卧室这样的私人地方一般访客是禁止访问的,而好朋友 就可以进去了,
问题四:什么是友元?它的作用有哪些?什么是友元函数和友元类 友元函数是指某些虽然不是类成员却能够访问类的所有成员的函数。。类授予它的友元特别的访问权。通常同一个开发者会出于技术和非技术的原因,控制类的友元和成员函数(否则当你想更新你的类时,还要征得其它部分的拥有者的同意)。
举个通俗的例子吧,
一个家庭,对一般的访客开发的是客厅,厨房等,但卧室这样的私人地方一般访客是禁止访问的,而好朋友 就可以进去了,
问题五:友元函数的作用是什么? 让一个不是类的成员函数的函数可以访问修改类的私有变量
问题六:友元函数有哪些特点? 友元函数和友元类: 通过友元,一个普通函数或类的成员函数可以访问另一个类的私有数据成员。 友元分为友元函数和友元类,关键字friend放在函数名之前,该函数就是友元函数,放在类名之前,该类就是友元类。友元声明在公有部分还是私有部分都不影响它的使用。 一个函数可以被多个类声明为友元这样就可引用多个类中的私有数据。 友元的关系是单向的,不是双向的。 友元关系不能传递。 给个例子:
#includeusing namespace std;#includeclass Time{ public: Time(int,int,int); friend void display(Time &);友元函数的声明 private: int hour,minute,second;};
Time::Time(int h,int m,int s){ hour=h; minute=m; second=s;}
void display(Time &t){ cout 问题七:C++中友元函数的优缺点 C++中,定义一个类中的成员分为私有成员、受保护成员和公有成员,我们知道,这些私有成员和受保护的成员是无法通过对象直接访问的,而是要通过调用公有成员函数从而间接的访问这些私有成员,那假如我的程序中出现循环要重复访问这个私有成员时,每次都要先通过调用公有成员间接的来访问该私有成员,这将造成空间和时间上的大大浪费。
所以,我们就想怎么样能够使对象直接访问这些私有成员呢?那我们就引入了友元这个概念,假设定义了一个A类,又定义了一个B类,如果我们想使B中的某个函数f1可以直接访问A类中的私有成员,那我们就在该函数f1的前面加上friend。
嘿嘿 废话比较多 只是想让你更加深入的了解友元。
如果让我说优缺点的话(用我的话来说):
(1)优点:可以使定义为友元函数或者友元类的函数直接访问另一个类中的私有成员和受保护成员,提高效率,方便编程。
(2)缺点:破坏了类的封装性,提供了安全漏洞
问题八:什么叫友元函数? 友元函数和友元类
采用类的机制后实现了数据的隐藏与封装,类的数据成员一般定义为私有成员,成员函数一般定义为公有的,依此提供类与外界间的通信接口。但是,有时需要定义一些函数,这些函数不是类的一部分,但又需要频繁地访问类的数据成员,这时可以将这些函数定义为该函数的友元函数。除了友元函数外,还有友元类,两者统称为友元。友元的作用是提高了程序的运行效率(即减少了类型检查和安全性检查等都需要时间开销),但它破坏了类的封装性和隐藏性,使得非成员函数可以访问类的私有成员。
友元函数 :
友元函数是可以直接访问类的私有成员的非成员函数。它是定义在类外的普通函数,它不属于任何类,但需要在类的定义中加以声明,声明时只需在友元的名称前加上关键字friend,其格式如下:
friend 类型 函数名(形式参数);
友元函数的声明可以放在类的私有部分,也可以放在公有部分,它们是没有区别的,都说明是该类的一个友元函数。
一个函数可以是多个类的友元函数,只需要在各个类中分别声明。
友元函数的调用与一般函数的调用方式和原理一致。
友元类 :
友元类的所有成员函数都是另一个类的友元函数,都可以访问另一个类中的隐藏信息(包括私有成员和保护成员)。
当希望一个类可以存取另一个类的私有成员时,可以将该类声明为另一类的友元类。定义友元类的语句格式如下:
friend class 类名;
其中:friend和class是关键字,类名必须是程序中的一个已定义过的类。
例如,以下语句说明类B是类A的友元类:
class A
{
…
public:
friend class B;
…
};
经过以上说明后,类B的所有成员函数都是类A的友元函数,能存取类A的私有成员和保护成员。
使用友元类时注意:
(1) 友元关系不能被继承。
(2) 友元关系是单向的,不具有交换性。若类B是类A的友元,类A不一定是类B的友元,要看在类中是否有相应的声明。
(3) 友元关系不具有传递性。若类B是类A的友元,类C是B的友元,类C不一定是类A的友元,同样要看类中是否有相应的申明
问题九:友元函数与成员函数的区别? 友元函数是非成员函数,可以在他的函数体中可以通过对象名访问类的的私有和保护成员,一般情况下,它在类中声明,在类外实现
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)