1、友元存在的意义
为什么要有友元函数?友元的存在可以共享数据资源,减小系统的调用开销,提升运行效率。funA想访问B类中的私有成员函数,只需要在B类的声明中加个friend returntype funA(T t);即可。其中friend是友元函数的标识,告诉编译器这是友元函数,不具备this指针,但是它能访问B类的私有成员函数,returntype 函数返回类型, T入参类型,t实参。
2、友元的优点以及缺点:
优点:提升编程效率,提升运行效率,并且表达清晰简单
缺点:破坏了封装机制,所以尽量不使用友元。
3、友元的参数
友元没有this指针
访问非static的成员时,需要对象做参数
访问static的成员或者全局变量时,不需要对象做参数
如果做参数的对象是全局成员,不需要对象做参数
4、友元的类型
4.1普通函数做友元
#include <iostream>
using namespace std;
class Print
{
private:
int num;
public:
Print(int Num) :num(Num){};
friend void frindFunc(Print &p);
void printNum()
{
cout << num << endl;
};
~Print(){};
};
void frindFunc(Print &p)
{
cout << p.num << endl;
return;
}
int main()
{
Print p(123);
frindFunc(p);
system("pause");
return 0;
}
4.2 类成员函数做友元
#include <iostream>
using namespace std;
class Print;
class Test
{
public:
Test();
void frindFunc(Print &p);
~Test();
private:
};
Test::Test()
{
}
Test::~Test()
{
}
class Print
{
private:
int num;
public:
Print() :num(123){};
friend void Test::frindFunc(Print &p);
void printNum()
{
cout << num << endl;
};
~Print(){};
};
void Test::frindFunc(Print &p)
{
p.printNum();
}
int main()
{
Print p;
Test t;
t.frindFunc(p);
system("pause");
return 0;
}
4.3 友元类
#include <iostream>
using namespace std;
class Print;
class Test
{
public:
Test();
void frindFunc(Print &p);
~Test();
private:
};
Test::Test()
{
}
void Test::frindFunc(Print &p)
{
cout << p.num << endl;
}
Test::~Test()
{
}
class Print
{
private:
int num;
public:
Print(int Num) :num(Num){};
friend class Test;
void printNum()
{
cout << num << endl;
};
~Print(){};
};
int main()
{
Print p(123);
Test t;
t.frindFunc(p);
system("pause");
return 0;
}