本文介绍: 友元函数可以直接访问类的private成员和protect成员,它是定义在类外部的普通函数,不属于任何类,但需要在类的内部声明,声明时需要加。写在类中进行一个声明即可。友元提供了一种突破封装的方式,有时提供了便利。但是友元会增加耦合度,破坏了封装,所以友元不宜多用。友元类的所有成员函数都可以是另一个类的友元函数,都可以访问另一个类中的非公有成员。为了解决类外函数无法访问类中的私有成员变量,我们只需使用友元函数。友元可以是一个函数,该函数被称为友元函数;使用:在函数声明前+
一、友元
友元提供了一种突破封装的方式,有时提供了便利。但是友元会增加耦合度,破坏了封装,所以友元不宜多用。
二、友元函数
友元函数可以直接访问类的private成员和protect成员,它是定义在类外部的普通函数,不属于任何类,但需要在类的内部声明,声明时需要加friend
关键字。
class Box
{
double width;
public:
double length;
friend void printWidth( Box box );
void setWidth( double wid );
};
- 友元函数可访问类的私有和保护成员,但不是类的成员函数
- 友元函数不能用const修饰
- 友元函数可以在类定义的任何地方声明,不受类访问限定符限制
- 一个函数可以是多个类的友元函数
- 友元函数的调用与普通函数的调用原理相同
比如下题
#include<iostream>
using namespace std;
class Date
{
public:
Date(int year = 0, int month = 1, int day = 1)
{
_year = year;
_month = month;
_day = day;
}
//友元函数声明
friend bool operator==(const Date& x1,const Date& x2);
private:
int _year;
int _month;
int _day;
};
bool operator==(const Date& x1,const Date& x2)
{
return x1._year == x2._year
&& x1._month == x2._month
&& x1._day == x2._day;
}
int main()
{
//创建两个对象,并赋初始值
Date d1(1919, 9,9);
Date d2(1919,9,9);
if (d1 == d2) {
cout << "true" << endl;
}
else {
cout << "false" << endl;
}
return 0;
}
为了解决类外函数无法访问类中的私有成员变量,我们只需使用友元函数。
friend
bool operator==(const Date& x1,const Date& x2);写在类中进行一个声明即可。
三、友元类
友元类的所有成员函数都可以是另一个类的友元函数,都可以访问另一个类中的非公有成员。
- 友元关系是单向的,不具有交换性。
- 比如上述Time类和Date类,在Time类中声明Date类为其友元类,那么可以在Date类中直接
- 访问Time类的私有成员变量,但想在Time类中访问Date类中私有的成员变量则不行。
- 友元关系不能传递
- 如果C是B的友元, B是A的友元,则不能说明C时A的友元。
- 友元关系不能继承。
class Time
{
friend class Date; {}// 声明日期类为时间类的友元类,则在日期类中就直接访问Time类
中的私有成员变量
}
原文地址:https://blog.csdn.net/luhaoran814/article/details/134712767
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_49208.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。