C++语言—友元函数和友元类

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/z_x_m_m_q/article/details/82501451

友元函数:

友元函数可以直接访问类的私有成员,它是定义在类外的普通函数,不属于任何类, 但需要在类内通过特殊的方式声明,这里特殊的方式指的就是在类内声明时需加上 friend 关键字

class Date
{
	//友元函数的声明
	friend ostream& operator <<(ostream& _cout, const Date& d);
public:
	Date(int year,int month,int day)
		:_year(year)
		,_month(month)
		,_day(day)
	{}
private:
	int _year;
	int _month;
	int _day;
};
//友元函数作为普通函数,再类外的定义
ostream& operator <<(ostream& _cout, const Date& d)
{
	_cout << d._year << "-" << d._month << "-" << d._day << endl;
	return _cout;
}
void test()
{
	Date d(2018, 9, 7);
	//想在这里连续输出就必须对上面函数设置返回值
	//设置成void 类型,不能连着用<< 运算符
	cout << d << endl;
}

 说明:

  1. 友元函数可以访问类的私有成员,但不是类的成员函数
  2. 友元函数不能用 const 修饰(因为它不是类的成员函数)
  3. 友元函数在类定义域内的任何地方都可声明,不受类访问限定符的限制
  4. 一个函数可以是多个类的友元函数
  5. 友元函数的调用和普通函数的调用原理相同

友元类:

友元类的所有成员函数都可以是另一个类的成员函数,可以访问另一个类中的私有成员

class Time
{
	//声明日期类为时间类的友元类
	//则在日期类中就直接访问Time类中的私有成员变量
	friend class Date;
public:
	//Time 类的构造函数需设计成缺省的构造函数
	//否则Date类的构造函数没有能力构造出Time类对象
	Time(int hour = 12,int minute = 0,int second = 0)
		:_hour(hour)
		,_minute(minute)
		,_second(second)
	{}
private:
	int _hour;
	int _minute;
	int _second;
};

class Date
{
public:
	Date(int year,int month,int day)
		:_year(year)
		,_month(month)
		,_day(day)
	{}
	void SetTime(int hour,int minute,int second)
	{
		//直接访问时间类私有的成员变量
		_t._hour = hour;
		_t._minute = minute;
		_t._second = second;
	}
private:
	int _year;
	int _month;
	int _day;
	Time _t;
};

 友元的优缺点:

优点:提高了程序运行效率

缺点:破坏了类的封装性和隐藏性

注意:

  1. 友元关系是单向的,不具有交换性
  2. 友元关系不能传递 

猜你喜欢

转载自blog.csdn.net/z_x_m_m_q/article/details/82501451