友元
1.知识点介绍
类的特性之一就是封装,而友元就是C 为用户提供打破这种封装的手段,友元分为友元函数和友元对象
2.友元函数
1、友元函数,他只是一个函数,友元函数不是类的成员,通过类对象是无法访问的,但是在这个函数中 有权通过访问类中的所有成员。 2、友元函数,无论声明在类中的任访问属性下都可以,不影响他的调用和访问
!!! 友元函数无论在类外定义, 还是在类内定义都不属于类
用例:
代码语言:javascript复制#include
using namespace std;
class CA {
int num; // 私有数据成员
void fun(); // 私有函数成员
friend void FFun(CA& a); // 类外定义友元函数
friend void FFun1(CA& a) // 类中定义友元函数
{
a.fun(); //友元函数中调用普通函数
}
};
void CA::fun()
{
cout << "测试成功" << endl;
}
void FFun(CA& a)
{
a.num = 15;
cout << a.num << endl;
}
int main()
{
CA a1;
FFun(a1); //结果: 15
FFun1(a1); //结果: 测试成功
return 0;
}
3.友元类
友元类是一个单独的类,只不过和友元函数一样,在类中声明了一个友元类,在这个友元类中同样也 可以访问该类中的所有成员,在A类中声明B类为A类的友元类,那么在B类中就可以访问A类中的所有成员
代码语言:javascript复制// 示例
示例:
class A
{
friend class B;
int id;
}
class B
{
public:
void fun(A & a)
{
cout<<a.id<<endl;
}
–>全面些的代码
代码语言:javascript复制#include
#include
using namespace std;
// CA是CTestClass的友元类
// CTestClass类
class CTestClass {
int id; //数据成员
char* name; //数据成员
friend class CA;
public:
CTestClass(); //构造
~CTestClass(); //析构
void setClassId(int i); //公有函数成员
void setClassName(char* n); //公有函数成员
void PrientClassId(); //公有函数成员
void PrientClassName(); //公有函数成员
};
CTestClass::CTestClass()
{
id = 0;
name = nullptr;
}
CTestClass::~CTestClass()
{
if (name)
delete[] name;
name = NULL;
}
void CTestClass::setClassId(int i) // 功能: 给CTestClass类成员ID赋值
{
id = i;
}
void CTestClass::setClassName(char* n) // 功能: 给CTestClass类成员NAME赋值
{
if (name)
delete[] name;
int len = strlen(n);
name = new char[len 1];
strcpy(name, n);
}
void CTestClass::PrientClassId() // 功能: 给CTestClass类成员ID打印
{
cout << "ID: " << id << endl;
}
void CTestClass::PrientClassName() // 功能: 给CTestClass类成员NAME打印
{
cout << "NAMW: " << name << endl;
}
// CA类
class CA {
// 使用系统默认构造析构
public:
void fun(CTestClass& c); // CA中定义一个对CTestClass类操作的函数
};
void CA::fun(CTestClass& c)
{
c.id = 10;
if (c.name)
delete[] c.name;
c.name = new char[11];
strcpy(c.name, "我是木杉乀");
}
int main()
{
CA a;
CTestClass Test;
a.fun(Test);
Test.PrientClassId();
Test.PrientClassName();
return 0;
}
4.友元的特性
- 单方向: A是B的朋友, A可以访问B的数据, B不可以访问A的数据
- 不传递: A是B的朋友, B是C的朋友, 但A和C没有关系
- 不继承: A是B的朋友, C是B的儿子, A和C没有关系