做网站还要维护吗,阿里培训网站建设,咸宁网站建设,达州市住房和建设厅网站一、友元
友元#xff08;friend#xff09;是C中的一种特殊关系#xff0c;用于在类之间共享访问权限。通过将一个函数或类声明为另一个类的友元#xff0c;我们可以允许友元访问声明类的非公有成员。
二、友元函数
问题#xff1a;现在尝试去重载operatorfriend是C中的一种特殊关系用于在类之间共享访问权限。通过将一个函数或类声明为另一个类的友元我们可以允许友元访问声明类的非公有成员。
二、友元函数
问题现在尝试去重载operator然后发现没办法将operator重载成成员函数。因为cout的 输出流对象和隐含的this指针在抢占第一个参数的位置。this指针默认是第一个参数也就是左操作 数了。但是实际使用中cout需要是第一个形参对象才能正常使用。所以要将operator重载成 全局函数。但又会导致类外没办法访问成员此时就需要友元来解决。
class Date
{
public:Date(int year, int month, int day): _year(year), _month(month), _day(day){}// d1 cout; - d1.operator(d1, cout); 不符合常规调用
// 因为成员函数第一个参数一定是隐藏的this所以d1必须放在的左侧ostream operator(ostream _cout){_cout _year - _month - _day endl;return _cout;}
private:int _year;int _month;int _day;
};
友元函数可以直接访问类的私有成员它是定义在类外部的普通函数不属于任何类但需要在 类的内部声明声明时需要加friend关键字。
class Date
{friend ostream operator(ostream _cout, const Date d);friend istream operator(istream _cin, 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;
}
istream operator(istream _cin, Date d)
{_cin d._year;_cin d._month;_cin d._day;return _cin;
}
int main()
{Date d;cin d;cout d endl;return 0;
} 需要注意以下几点
友元函数可访问类的私有和保护成员但不是类的成员函数友元函数不能用const修饰友元函数可以在类定义的任何地方声明不受类访问限定符限制一个函数可以是多个类的友元函数友元函数的调用与普通函数的调用原理相同 三、友元类
【注意】
友元类的所有成员函数都可以是另一个类的友元函数都可以访问另一个类中的非公有成员。友元关系不能传递如果C是B的友元 B是A的友元则不能说明C时A的友元。友元关系不能继承友元关系是单向的不具有交换性。
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;
};