成员函数做友元(成员函数,全局函数,友元函数的区别)
今天给各位分享成员函数做友元的知识,其中也会对成员函数,全局函数,友元函数的区别进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
C++中成员函数和友元函数如何区分
1.友元函数和类的成员函数都可以访问类的私有成员变量或者是成员函数,但是他们调用的形式不同。
2.成员函数是属于类的,所以调用的时候是通过指针this调用的。而友元函数不属于类,当然也不能有this指针了,也就是在友元函数中不能出现this指针。同时友元函数是有关键字friend修饰。
3.再有的情况下,友元函数是很有用的。特别是在重载一些操作符的时候用处很明显。
成员函数重载运算符和友元函数重载运算符
先上题:下列运算符都可以被友元函数重载的是:
A)=,+,-,
B) [],+,(),new
C)->,+,,>>
D)<<,>>,+,
正确答案为D
在运算符重载,友元函数运算符重载函数与成员运算符重载函数的区别是:友元函数没有this指针,而成员函数有,因此,在两个操作数的重载中友元函数有两个参数,而成员函数只有一个。
重载运算符的基本原则:
下面比较成员函数和非成员函数(友元函数)重载运算符
所以说,单目运算符建议选择成员函数。
下面是重点
=,(),[],->
原因很简单,会和编译器默认分配的运算符重载成员函数冲突,引发歧义。
我们知道友元函数不是类的成员函数,它只是类的“朋友“,具有访问把它声明为“朋友”的类的数据成员的权限而已。
那么当把赋值运算符重载为类的友员函数,在程序中执行类对象的赋值语句时,程序就会出现两种矛盾的选择。
程序是不允许有矛盾不确定选择的,所以当赋值运算符重载为类的友元函数时,编译器就会提示错误。
对于剩下的3个运算符->, [],()为什么不能重载为友元函数,也是跟上面一样的道理。即编译器发现当类中没有定义这3个运算符的重载成员函数时,就会自己加入默认的运算符重载成员函数。
那么下面这个题的答案也就很明显了:
将x+y*z中的“+”用成员函数重载,“*”用友元函数重载应该写为:?
答案为:x.operator+(operator*(y,z))
C++友原函数求教
C++友元函数是可以直接访问类的私有成员的非成员函数。它是定义在类外的普通函数,它不属于任何类,但需要在类的定义中加以声明,声明时只需在友元的名称前加上关键字friend。
类具有封装和信息隐藏的特性。只有类的成员函数才能访问类的私有成员,程序中的其他函数是无法访问私有成员的。非成员函数可以访问类中的公有成员,但是如果将数据成员都定义为公有的,这又破坏了隐藏的特性。另外,应该看到在某些情况下,特别是在对某些成员函数多次调用时,由于参数传递,类型检查和安全性检查等都需要时间开销,而影响程序的运行效率。
为了解决上述问题,提出一种使用友元的方案。友元是一种定义在类外部的普通函数,但它需要在类体内进行说明,为了与该类的成员函数加以区别,在说明时前面加以关键字friend。友元不是成员函数,但是它可以访问类中的私有成员。友元的作用在于提高程序的运行效率(即减少了类型检查和安全性检查等都需要的时间开销),但是,它破坏了类的封装性和隐藏性,使得非成员函数可以访问类的私有成员。
友元可以是一个函数,该函数被称为友元函数;友元也可以是一个类,该类被称为友元类。
友元函数的特点是能够访问类中的私有成员的非成员函数。友元函数从语法上看,它与普通函数一样,即在定义上和调用上与普通函数一样。
好了,关于成员函数做友元和成员函数,全局函数,友元函数的区别的问题到这里结束啦,希望可以解决您的问题哈!