迁安网站开发,做网站用什么源码,app展示主题wordpress,网络平台维护1.友元介绍
在C中#xff0c;友元#xff08;friend#xff09;是一种机制#xff0c;允许某个类或函数访问其他类的私有成员。通过友元#xff0c;可以授予其他类或函数对该类的私有成员的访问权限。友元关系在一些特定的情况下很有用#xff0c;例如在类之间共享数据或…1.友元介绍
在C中友元friend是一种机制允许某个类或函数访问其他类的私有成员。通过友元可以授予其他类或函数对该类的私有成员的访问权限。友元关系在一些特定的情况下很有用例如在类之间共享数据或实现特定的功能。 友元可以分为两种类型类友元和函数友元。
2.类友元
类友元Friend Class 可以将一个类声明为另一个类的友元。这样在被声明为友元的类中就可以直接访问另一个类的私有成员。 类友元关系在类之间共享数据或实现特定功能时很有用。 友元关系是单向的不具有传递性。如果类A是类B的友元类B不一定是类A的友元。 友元关系通常在类的声明部分使用 friend 关键字来声明。 2.1示例代码
class FriendClass {
private:int privateData;
public:FriendClass() : privateData(0) {}friend class OtherClass; // 声明 OtherClass 是 FriendClass 的友元类
};
class OtherClass {
public:void accessPrivateData(FriendClass obj) {obj.privateData 42; // 可以直接访问 FriendClass 的私有成员}
};
3.函数友元
函数友元Friend Function
可以将一个函数声明为一个类的友元函数。这样在友元函数中可以直接访问该类的私有成员。
友元函数可以是非成员函数也可以是其他类的成员函数。
友元函数通常在类的声明部分或声明外部使用 friend 关键字来声明。3.1示例代码 class MyClass {
private:int privateData;
public:MyClass() : privateData(0) {}friend void friendFunction(MyClass obj); // 声明 friendFunction 是 MyClass 的友元函数
};
void friendFunction(MyClass obj) {obj.privateData 42; // 可以直接访问 MyClass 的私有成员
}
4.总结
友元的使用场景包括但不限于以下情况 当两个或多个类需要共享私有数据时可以使用类友元来实现数据的直接访问而无需通过公有接口。 当某个类需要提供特定函数或操作给其他类使用但这些函数需要访问类的私有成员时可以使用函数友元。 在重载运算符或实现某些特定功能时友元可以提供对类私有成员的直接访问。 需要注意的是友元机制破坏了封装性因为其他类或函数可以直接访问被授予友元权限的类的私有成员。因此应谨慎使用友元只在必要的情况下使用并且仅将其授予最少的访问权限。 在C中我们使用类对数据进行了隐藏和封装类的数据成员一般都定义为私有成员成员函数一般都定义为公有的以此提供类与外界的通讯接口。但是有时需要定义一些函数这些函数不是类的一部分但又需要频繁地访问类的数据成员这时可以将这些函数定义为该函数的友元函数。除了友元函数外还有友元类两者统称为友元。友元的作用是提高了程序的运行效率即减少了类型检查和安全性检查等都需要时间开销但它破坏了类的封装性和隐藏性使得非成员函数可以访问类的私有成员。 下面我们来看一段代码看看我们是如何利用友元来访问类的一切成员的
#include iostream
using namespace std;
class Internet
{
public:
Internet(char *name,char *address) // 改为internet(const char *name , const char *address)
{
strcpy(Internet::name,name);
strcpy(Internet::address,address);
}
friend void ShowN(Internet obj); //友元函数的声明
public: // 改为private
char name[20];
char address[20];
};
void ShowN(Internet obj) //类外普通函数定义访问a对象的保护成员name,不能写成,void Internet::ShowN(Internet obj)
{
coutobj.nameendl; //可访问internet类中的成员
}
void main()
{
Internet a(谷歌,http://www.google.cn/;);
ShowN(a);
cin.get();
} 示例2分别定义一个类A和类B 各有一个私有整数成员变量通过构造函数初始化类A有一个成员函数Show(B b)用来打印A和B的私有成员变量请分别通过友元函数和友元类来实现此功能。使用友元类 和 友元函数实现
#include iostreamusing namespace std;
class B;
class A;
void Show( A , B );class B
{
private:
int tt;
friend class A;
friend void Show( A , B );public:
B( int temp 100):tt ( temp ){}};class A
{
private:
int value;
friend void Show( A , B );public:
A(int temp 200 ):value ( temp ){}void Show( B b )
{cout value endl;cout b.tt endl;
}
};void Show( A a, B b )
{
cout a.value endl;
cout b .tt endl;
}int main()
{
A a;
B b;
a.Show( b );
Show( a, b );return 0;
}