编程语言
首页 > 编程语言> > C++友元

C++友元

作者:互联网

目录

类的友元

可以把某些选定的函数看作类的“荣誉函数”,允许它们访问类对象中非公共的成员,就好像它们是类的成员一样,这种函数称为类的友元。友元可以访问类对象的任意成员。

可以把一个函数指定为类的友元,也可以把整个类指定为另一个类的友元。

友元函数

友元函数是一种定义在类外部的普通函数,但它需要在类体内进行说明。

为了与该类的成员函数加以区别,定义的方式是在类中用关键字friend说明该函数,格式如下:
friend 类型 友元函数名(参数表);

友元函数可以访问其他类中的私有成员,有助于数据共享,提高程序效率,但它又是对封装性的一个破坏,所以程序中不能大量使用友元

实例

#include<iostream>
#include <math.h>
using namespace std;

class Coordinate
{
public:
    Coordinate(int x=0, int y=0){m_iX = x;m_iY = y;}
    friend void printXY(Coordinate &c);
private:
    int m_iX;
    int m_iY;
};

void printXY(Coordinate &c)
{
    cout<<c.m_iX<<c.m_iY;
}

int main(void)
{
    Coordinate coor(3,5);
    printXY(coor); //调用全局友元函数
    //coor.printXY(coor); //错误
    return 0;
}

执行结果:

35

友元函数的注意事项

①友元函数不是类的成员函数,在函数体中访问对象的成员,必须用对象名加运算符“.”加对象成员名。但友元函数可以访问类中的所有成员(公有的、私有的、保护的),一般函数只能访问类中的公有成员。

②友元函数不受类中的访问权限关键字限制,可以把它放在类的公有、私有、保护部分,但结果一样。

③某类的友元函数的作用域并非该类作用域。如果该友元函数是另一类的成员函数,则其作用域为另一类的作用域,否则与一般函数相同。

④友元函数破坏了面向对象程序设计类的封装性,所以友元函数如不是必须使用,则尽可能少用。或者用其他手段保证封装性。

友元类

如果某类B的成员函数会频繁的存取另一个类A的数据成员, 而A的数据成员的Private/Protectd限制造成B存取的麻烦, B只能通过Public的成员函数进行间接存取。

把B做成A类的友元类,即A类向B类开放其Private/Protectd内容, 让B直接存取。

友元类:一个类可以作另一个类的友元。

友元类的所有成员函数都是另一个类的友元函数。

友元类的定义:
friend class 类名;

实例

#include <iostream>
using namespace std;

class CRect;

class CTest
{
public:
    int Area(CRect &rect);
};
class CRect
{
public:
    CRect();
    CRect(int len,int wid);
    friend class CTest;
private:
    int m_len;
    int m_wid;
};
int CTest::Area(CRect &rect)
{
    return rect.m_len*rect.m_wid;
}

CRect::CRect()
{
    m_len=m_wid=5;
}
CRect::CRect(int len,int wid)
{
    m_len=len;
    m_wid=wid;
}
int main()
{
   int count;
   CRect aRect(6,8);
   CTest aTest;
   count = aTest.Area(aRect);
   cout<<"count = "<<count<<endl;
   return 0;
}

执行结果:

count = 48

标签:友元,函数,int,成员,CRect,C++,len
来源: https://blog.csdn.net/qq_46485161/article/details/115431645