0
点赞
收藏
分享

微信扫一扫

C++友元函数和友元类

爱奔跑的读书者 2022-01-17 阅读 231
c++

        类的友元函数是定义在类外部,但有权访问类的所有私有(private)成员和保护(protected)成员。尽管友元函数的原型有在类的定义中出现过,但是友元函数并不是成员函数。

        友元可以是一个函数,该函数被称为友元函数;

class Box
{
private:
   double width;

public:
   double length;
   void setWidth(double width);

   friend void printWidth(Box box);      //友元函数
};

        友元也可以是一个类,该类被称为友元类,在这种情况下,整个类及其所有成员都是友元。

class A
{
   friend class B;         //友元类

public:
   void Display();

private:
   int m_nData;
};

友元函数

      方式一:全局函数声明为友元函数

    方式二:其他类的成员函数声明为友元函数(备注:不能为私有函数)

       C++中引入友元函数的目的是让函数或类能够访问一个类的私有数据。如果要声明函数为一个类的友元,需要在类定义中该函数原型前使用关键字 friend。

友元函数不是当前类的成员函数,需要在其函数名前加上关键字friend,友元函数需要声明在当前类中,而定义可以在类中,也可以在类外。

示例1:友元函数修改类的私有成员数据

class A
{
public:
	A()
	{
		a1 = 100;
		a2 = 200;
	}
	int getA()
	{
		return this->a1;
	}
	//声明一个友元函数
	friend void setA(A1 *p, int a1); //该说明语句位置与访问描述(private/protected/public)无关
	
protected:
private:
	int a1;
	int a2;
};

//友元函数定义
void setA(A *p, int a1)
{
	p->a1 = a1;
}

void main()
{
	A mya;
	cout<<mya.getA()<<endl; 
	setA(&mya, 300); //通过友元函数 修改A类的私有数据成员
	cout<<mya.getA()<<endl;

	system("pause");
}

示例2: 

#include <iostream>
#include <math.h>

class Point
{
	Point(double xi, double yi){X = xi; Y = yi;}
	
	double GetX() {return X;}
	double GetY() {return Y;}
	
	friend double Distance(Point &a, Point &b);
	
private:
    double X, Y;
};

double Distance(Point &a, Point &b)
{
	double dx = a.X - b.X;
	double dy = a.Y - b.Y;
	
	return sqrt(dx * dx, dy * dy);
}

void main()
{
	Point p1(3.0, 5.0), p2(4.0, 6.0);
	
	double d = Distance(p1, p2);
	
	cout<<"Distance is"<<d<<endl;
}

友元类

        声明方式:

        若B类是A类的友员类,则B类的所有成员函数都是A类的友员函数,即类 B 的所有成员函数就都可以访问类 A 对象的私有成员。

 示例:

#include <iostream>

class A
{
	friend class B;
	
public:
	void Display(cout<<x<<endl);
	
private:
	int x;
};

//友元类B
class B
{
public:
	void Set(int i){Aobject.x = i;}
	void Display() {Aobject.Display}
	
private:
	A Aobject;
};

void main()
{
	B Bobject;
	
	Bobject.Set(100);
	Bobject.Display();
}
举报

相关推荐

0 条评论