友元类

139 阅读2分钟

一、友元类

「这是我参与2022首次更文挑战的第28天,活动详情查看:2022首次更文挑战

class Date; //前置声明
class Time
{
	friend class Date; //声明日期类为时间类的友元类,则在日期类中就直接访问Time类中的私有成员变量
public:
	Time(int hour, int minute, int second)
 	: _hour(hour)
 	, _minute(minute)
 	, _second(second)
 {}
 private:
 	int _hour;
 	int _minute;
 	int _second;
};
class Date
{
public:
 	Date(int year = 1900, int month = 1, int day = 1)
 	: _year(year)
 	, _month(month)
 	, _day(day)
{}
void SetTimeOfDate(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、友元关系是单向的,不具有交换性。比如上述 Time 类和 Date 类,在 Time 类中声明 Date 类为其友元类,那么可以在 Date 类中直接访问 Time 类的私有成员变量,但想在 Time 类中访问 Date 类中私有的成员变量则不行。

2、友元关系不能传递,如果 C 是 B 的友元, B 是 A 的友元,则不能说明 C 是 A 的友元。

二、C++11的成员初始化新玩法

class A
{
public:
	A(int a = 0)
		: _a(0)
	{}
private:
	int _a;
};
class B
{
private:
	//缺省值 
	int _b = 0;
	int* p = (int*)malloc(sizeof(int)*10);
	A _aa = A(10);//先构造再拷贝构造,优化为构造
	A _aa = 10;//同上,建议
	//static int _n = 10;//err,静态变量不能给缺省值
};
int main()
{
	B bb;	
	return 0;
}

📝说明

C++11 支持非静态成员变量在声明时进行初始化赋值,但是要注意这里不是初始化,这里是给声明的成员变量缺省值 —— 如果在构造函数中显示给值就会不用缺省值,如果没有显示给,就会用缺省值。这里在上篇文章我们就提到过,这里就写一些上篇文章所没提到过的。