面向对象提高———友元

友元函数:

1:一个类的友元函数可以访问该类的私有成员.

#include <iostream>

using namespace std;

class CCar ; //提前声明 CCar类,以便后面的CDriver类使用
class CDriver
{
	public:
		void ModifyCar( CCar * pCar) ; //改装汽车
};

class CCar
{
	private:
		int price;
		
	public:
	CCar(int p):price(p){		} //CCar的构造函数 
	
	friend int MostExpensiveCar( CCar cars[], int total); //声明MostExpensiveCar为CCar类的友元函数 
	
	friend void CDriver::ModifyCar(CCar * pCar); //声明ModifyCar为CCar类的友元函数 
};

void CDriver::ModifyCar( CCar * pCar) 
{
	pCar->price += 1000; //汽车改装后价值增加
	cout<<"CCar类的友元函数"<<endl; 
}

int MostExpensiveCar( CCar cars[],int total) 
//求最贵汽车的价格
{
	cout<<"CCar类的友元函数"<<endl; 
	 
	int tmpMax = -1;
	for( int i = 0;i < total; ++i )
		if( cars[i].price > tmpMax)
		tmpMax = cars[i].price;
	return tmpMax;
}


int main()
{
	CCar a[] = {200,800,700,100,1000} ;
	CDriver b;
	b.ModifyCar(a+2);        //调用一次友元函数 ,a+2表示将第3辆车进行改装,价格变为1700 
		
	int c = MostExpensiveCar(a,5);  //调用第二次友元函数 
	cout<<c;                        //输出最贵的车1700 
	return 0;
}

/*
输出结果:
CCar类的友元函数
CCar类的友元函数
1700
*/

注意:

1:如果要声明函数为一个类的友元,需要在类定义中该函数原型前使用关键字 friend。
2:一个类的友元函数可以是其他类的成员函数(包括构造、析构函数)。

友元类:

1:如果A是B的友元类,那么A的成员函数可以访问B的私有成员。

#include <iostream>

using namespace std;
class CCar
{
	private:
		int price=1;
	public: 
		int p=0;
	friend class CDriver; //声明CDriver是CCar的友元类
};
class CDriver
{
	public:
		CCar myCar;
		
		void ModifyCar() {//改装汽车
			cout<<++myCar.p<<endl;
			myCar.price += 1000;
			cout<<myCar.price<<endl;//因CDriver是CCar的友元类,故此处可以访问其私有成员
		}
};
int main(){
	
	CDriver a;
	a.ModifyCar();
	return 0; 
}
/*
输出结果:
1
1001

*/

猜你喜欢

转载自blog.csdn.net/qq_44923545/article/details/106043397