目录
2:将这个函数声明为一个类的成员函数,其他一个或多个类的友元函数
友元分为:友元函数和友元类
友元函数:
1:友元函数可以直接访问类的私有成员,它是定义在类外部的普通函数,不属于任何类,但需要在类的内部声明,声明时需要加friend关键字。
友元函数的优点是:提高编程的灵活性和线程执行的效率。缺点是:破坏了类的封装机制
反例:
示范代码:
#include<iostream>
using namespace std;
class Date
{
friend void PrintfDate(const Date& d);
public:
Date(int year, int month, int day)
:_year(year)
, _month(month)
, _day(day)
{}
private:
int _year;
int _month;
int _day;
};
void PrintfDate(const Date& d)
{
cout << d._year << "-" << d._month << "-" << d._day << endl;
}
int main()
{
Date d(2018,9,10);
PrintfDate(d);
return 0;
}
正确结果:
友元函数说明:
- 友元函数可以访问类的私有成员,但不是类的成员函数,所以也没有隐含的this指针
- 友元函数不能用const修饰
- 友元函数可以在类定义的任何地方声明,不受类的访问限定符限制
- 一个函数可以是多个类的友元函数
- 友元函数和普通函数的调用原理相同(传值),不需要通过对象来调用
操作多个对象数据成员的友元函数:
1:将函数声明为相关类的友元函数:
如果一个函数需要操作多个不同类对象的非公有成员,有以下两种方式:
class B;//向前引用声明
class A
{
friend int fun(A & ,B &);//声明为A类友元函数
//...
};
class B
{
friend int fun(A &,B &); // 声明为B类友元函数
//...
};
int fun(A& a, B& b)//fun()函数实现
{};
这样可以通过fun()函数直接可以访问A,B类对象的非公有成员
由于函数fun()的形参为A类的对象和B类的对象,所以需要使用向前引用声明,因为c++在调用资源时应确保调用前进行过声明或定义,否则调用无效,程序出错
2:将这个函数声明为一个类的成员函数,其他一个或多个类的友元函数
class A;//向前引用声明
class B
{
int fun(A & ,B &);//声明fun为B类的成员元函数
//...
};
class A
{
friend int B::fun(A &,B &); // 声明B::fun为A类友元函数
//...
};
int B::fun(A& a, B& b)//fun()函数实现
{};
友元类:
友元类的所有成员函数的都可以是另一个类的友元函数,,都可以访问另一个类的非公有成员。
class A //A类
{
//...//B类成员声明
public:
friend class B;//声明类A的友元类B
//...
};
//A,B类的实现
- 友元关系不能被继承
- 友元关系是单向的,不具有交换性
- 友元关系不能传递
#include<iostream>
using namespace std;
class A //A类
{
int n;
public:
A() { n = 5; };
friend class B;//声明类A的友元类B
};
class B
{
public:
void printf(A tmp) { cout << tmp.n << endl; };
};
void main()
{
A a;
B b;
b.printf(a);
}