一、友元类
「这是我参与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 支持非静态成员变量在声明时进行初始化赋值,但是要注意这里不是初始化,这里是给声明的成员变量缺省值 —— 如果在构造函数中显示给值就会不用缺省值,如果没有显示给,就会用缺省值。这里在上篇文章我们就提到过,这里就写一些上篇文章所没提到过的。