友元函数的意义有三点:
1.友元类的声明:1.1两个独立的类A、B,在A中声明了友元类B,那么B类对象就可以访问A类的私有成员、私有函数
1.2在B类中有内部类C,想要访问C或者对C进行的一系列操作都需要在类B中(C类外部)将C声明为友元函数
2.友元函数的声明:将全局函数在类中声明成由友元函数,那么全局函数就可以访问A类的私有成员、私有函数
#include <iostream>
using namespace std;
class A
{
public:
//1.友元类的声明 // 声明的位置 和 public private没有关系
friend class B;//B类是A的好朋友 ,在B中可以访问A类的私有成员、私有函数
//2.友元函数的声明
friend void modifyA(A *pA, int _a); //函数modifyA是类A的好朋友,可以访问A类的私有成员
friend void modifyA1(A &a, int _a);
A(int a = 0, int b = 0)
{
this->a = a;
this->b = b;
}
int getA()
{
return this->a;
}
private:
int a;
int b;
};
//类B,在类A中进行了声明就可以作为A的友元函数
class B
{
public:
void Set(int a)
{
Aobject.a = a;//给类A中的私有变量a赋值
}
void printB()
{
cout << Aobject.a << endl;
}
friend class C;
class C//内部类需要友元函数在外部类声明才能使用,使用时需要使用域名符::
{
public:
int c = 0;
};
private:
A Aobject;//组合类A,产生一个类A的对象
};
void modifyA(A *pA, int _a)//因为有了友元函数在类A中的声明,才能访问A的私有成员
{
pA->a = _a;
}
void modifyA1(A &pa, int _a)
{
pa.a = _a;
}
void main03()
{
B b1;
b1.Set(300);
b1.printB();
system("pause");
}
void main04()
{
A a1(1, 2);
cout << a1.getA() << endl;
modifyA(&a1, 300);//指针的方式传递对象
modifyA1(a1, 400);//引用的方式传递对象
cout << a1.getA() << endl;
B::C obj;
cout << obj.c << endl;
cout << "hello..." << endl;
system("pause");
return;
}