首页 > 编程知识 正文

友元函数类外,类模板的友元函数

时间:2023-05-04 08:57:19 阅读:272372 作者:1452

一  友元函数的定义与调用 

       C++类除了成员函数,静态成员函数,还有一种函数:友元函数。

       友元函数和类一种朋友关系,它不属于类,但可以访问类的私有成员,它和类是一种朋友关系,也不需要用类的对象去驱动,例如下面的代码:

#include <iostream>using namespace std;class ASD{ friend int getData(const ASD& asd);private: int m_Value;public: ASD(int value = 0):m_Value(value){} ~ASD(){}};int getData(const ASD& asd){ return asd.m_Value;}int main() { ASD obj(123); cout << "m_Value = " << getData(obj) << endl; return 0;}

      getData是类ASD的友元函数,在大括号里声明,在外面定义,不需要作用域限定符,调用的时候就和全局函数一样的调用。

二 友元函数的应用

     友元函数经常应用于运算符重载。例如下面的代码,实现数和对象相加

#include <iostream>using namespace std;class Fushu{ friend Fushu operator+(int i, const Fushu& fu);private: int m_Real; int m_Xu;public: Fushu(int real, int xu) { m_Real = real; m_Xu = xu; } int getReal() { return m_Real; } int getXu() { return m_Xu; }};Fushu operator+(int i, const Fushu& fu){ int real = i + fu.m_Real; int xu = fu.m_Xu; return Fushu(real, xu);}int main(){ Fushu f1(3, -2); Fushu f2 = 4 + f1; cout << f2.getReal() << f2.getXu() << "i" << endl; return 0;} 三 友元类

        友元类的所有成员函数都是另一个类的友元函数,都可以访问另一个类中的隐藏信息(包括私有成员和保护成员)。当希望一个类可以存取另一个类的私有成员时,可以将该类声明为另一类的友元类。

关于友元类的注意事项:

(1) 友元关系不能被继承。
(2) 友元关系是单向的,不具有交换性。若类B是类A的友元,类A不一定是类B的友元,要看在类中是否有相应的声明。
(3) 友元关系不具有传递性。若类B是类A的友元,类C是B的友元,类C不一定是类A的友元,同样要看类中是否有相应的申明。

代码如下:

#include <iostream>using namespace std;class A{ friend class C; //这是友元类的声明, C是A的友元类private: int data;};class C //友元类定义,为了访问类A中的成员{public: void show(int x, A& a) { a.data = x; cout << a.data << endl; }};int main(void){ class A a; class C c; c.show(1, a); //C的对象访问A的成员 return 0;}

           总结:友元可以访问类的私有属性,但破坏了类的封装性。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。