21xrx.com
2024-12-22 23:46:22 Sunday
登录
文章检索 我的文章 写文章
C++中的友元函数和友元类
2023-06-26 21:59:25 深夜i     --     --
友元函数 友元类 访问权限 封装性 面向对象编程

C++中的友元函数和友元类是一种特殊的机制,可以让函数或类在访问另一个类的私有或保护成员时不受限制。在面向对象编程中,很多时候需要允许某些函数或类访问对象的私有数据,但是为了保证数据的安全性,一般情况下不会将这些数据暴露出来。这时候就可以使用友元机制。

友元函数是指在声明中使用关键字friend的普通函数。它可以访问包含类的私有或保护成员,但并不是该类的成员函数。友元函数的定义不在类的内部,而是在类的外部。

例如,下面的代码演示了如何声明并使用一个友元函数:


class MyClass {

private:

 int myVar;

 friend void friendFunc(MyClass& obj);

public:

 MyClass(int value) : myVar(value) {}

};

void friendFunc(MyClass& obj) {

 obj.myVar++;

}

在这个例子中,MyClass类中声明了一个私有变量myVar,同时声明了一个友元函数friendFunc,该函数可以访问myVar。在friendFunc函数中,通过引用传递MyClass对象obj,可以直接访问其中的myVar变量并将其加1。

友元类与友元函数类似,也是在声明中使用关键字friend声明的。不同的是,友元类可以访问包含类的所有成员,包括私有成员、保护成员和公共成员。而且,友元类中的所有成员函数都可以访问包含类的成员。

下面是一个友元类的例子:


class MyClass {

private:

 int myVar;

 friend class FriendClass;

public:

 MyClass(int value) : myVar(value) {}

};

class FriendClass {

public:

 void setVar(MyClass& obj, int value)

  obj.myVar = value;

 

};

int main() {

 MyClass obj(10);

 FriendClass fc;

 fc.setVar(obj, 20);

 return 0;

}

在这个例子中,MyClass类中声明了一个私有变量myVar,同时声明了一个友元类FriendClass,该类可以访问MyClass的所有成员。在FriendClass中,定义了一个setVar函数,可以直接修改MyClass中的myVar变量。在主函数中,创建了一个MyClass对象obj并赋初值为10,然后创建了一个FriendClass对象fc,并调用其setVar函数将obj的myVar值修改为20。

总之,友元机制在一定程度上破坏了对象的封装性,因此应该谨慎使用。友元函数和友元类虽然可用于方便地访问私有成员,但过度使用将导致代码不易维护和危险隐患。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复