cnnic可信网站必须做吗?,江门网络建站模板,下载app最新版,长沙网站设计优刻友元友元提供了一种突破封装的方式#xff0c;有时提供了便利。但是友元会增加耦合度#xff0c;破坏了封装#xff0c;所以 友元不宜多用。 友元分为#xff1a;友元函数和友元类友元函数问题现在尝试去在Date类里重载operator。无论怎样设置参数#xff0c;只要…友元
友元提供了一种突破封装的方式有时提供了便利。但是友元会增加耦合度破坏了封装所以 友元不宜多用。 友元分为友元函数和友元类
友元函数
问题现在尝试去在Date类里重载operator。无论怎样设置参数只要他是非静态成员函数它的第一个参数必定是隐含的this指针又因为操作数的顺序就是传入参数的顺序所以我们要使用这个运算符重载就必须datecout这不符合使用习惯。class Date
{
public:
Date(int year, int month, int day): _year(year), _month(month), _day(day){}
ostream operator(ostream _cout){_cout _year - _month - _day endl;return _cout;}
private:
int _year;
int _month;
int _day;
};int main()
{Date date(2002,7,11);datecout;// 因为成员函数第一个参数一定是隐藏的this所以date必须放在的左侧
//虽然结果正确但不符合正常使用的顺序
}使用显而易见可以想到的是我们把运算符重载作为类外函数而不是成员函数这样我们就可以随心调整参数的位置。然而这又引发了问题类外函数没有权限访问类内成员一般类成员变量都是私有也就没法打印日期信息了。友元函数解决了类外函数访问类内成员的权限问题
class Date
{friend ostream operator(ostream _cout, const Date d);//声明友元函数
public:Date(int year 1900, int month 1, int day 1): _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;return _cout;
}int main()
{Date date;cout date endl;return 0;
}在一个类内使用friend声明一个函数这个函数就叫做这个类的友元函数可以访问类内的所有成员就像成员函数一样实际上不是。特性友元函数可访问类的私有和保护成员但不是类的成员函数 友元函数不能用const修饰指的是用const修饰函数也就是修饰this指针友元函数可以在类定义的任何地方声明不受类访问限定符限制 一个函数可以是多个类的友元函数 友元函数的调用与普通函数的调用原理相同友元类
使用
class Time
{friend class Date;// 声明日期类为时间类的友元类则在日期类中就直接访问Time类中的私有成员变量
public:Time(int hour 0, 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 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;
};特性友元类的所有成员函数都可以是另一个类的友元函数都可以访问另一个类中的非公有成员。 友元特性友元关系是单向的不具有交换性。 比如上述Time类和Date类在Time类中声明Date类为其友元类那么可以在Date类中直接 访问Time类的私有成员变量但想在Time类中访问Date类中私有的成员变量则不行。 友元关系不能传递。如果C是B的友元 B是A的友元则不能说明C时A的友元。 友元关系不能继承。