c++友元函数,友元类这有啥用呢,如何使用友元函数和友元类。

c++友元函数,友元类这有啥用呢

在 C++ 中,友元函数和友元类的概念允许非成员函数或者外部类访问一个类的私有成员或保护成员。这种机制虽然破坏了面向对象编程的封装性原则,但在某些特定情况下是有用的,主要体现在以下几个方面:

友元函数的用处:
增强类的灵活性和功能:

友元函数可以访问类的私有成员或保护成员,从而扩展了类的功能性。例如,某些操作可能不适合作为类的成员函数,但又需要访问类的私有成员,这时可以设计为友元函数。
提高效率:

友元函数可以直接访问类的成员,避免了通过公有接口进行间接访问,从而提高了效率。这在一些性能敏感的场景中可能很重要。
协助重载操作符:

当需要重载操作符(如 << 和 >>)用于自定义类型时,通常需要将这些函数声明为友元函数,以便访问类的私有成员变量。
友元类的用处:
增强类之间的协作关系:

友元类允许指定的类访问另一个类的私有成员,这在一些紧密相关的类之间可以简化交互,提高效率。
共享信息:

如果两个类需要共享一些私有成员,但不希望将这些成员设为公有或提供访问函数,可以考虑将一个类声明为另一个类的友元类。
简化设计:

在某些情况下,使用友元类可以简化设计和实现,特别是在类之间存在复杂的交互和依赖关系时。
注意事项:
破坏封装性:

友元函数和友元类破坏了封装性原则,增加了类的耦合性。因此,使用友元应谨慎,并仔细考虑是否有更好的设计方式来避免使用友元。
限制和安全性:

友元机制应当合理使用,确保在需要的情况下使用,同时保证代码的安全性和可维护性。
总的来说,友元函数和友元类提供了一种突破类的封装性的方式,使得某些特定的操作和交互更加方便和高效。然而,应当在设计时慎重考虑,确保其合理性和必要性。

让我们通过几个简单的示例来说明如何使用友元函数和友元类。

示例一:友元函数
假设我们有一个类 Box,它有私有成员 length 和 width,我们希望计算两个 Box 对象的面积,但不希望将面积计算函数设为 Box 的成员函数,可以考虑使用友元函数。

cpp
#include

class Box {
private:
double length;
double width;

public:
Box(double l, double w) : length(l), width(w) {}

// 声明友元函数
friend double calculateArea(const Box& box);

};

// 定义友元函数,计算面积
double calculateArea(const Box& box) {
return box.length * box.width;
}

int main() {
Box myBox(3.0, 4.0);

// 调用友元函数计算面积
double area = calculateArea(myBox);
std::cout << "Area of the box: " << area << std::endl;

return 0;

}
在上面的例子中:

Box 类有私有成员 length 和 width。
calculateArea 函数被声明为 Box 类的友元函数,在函数体外定义,可以直接访问 Box 类的私有成员。
main 函数中创建了一个 Box 对象 myBox,然后通过 calculateArea 函数计算并输出了 myBox 的面积。
示例二:友元类
假设我们有两个类 A 和 B,A 类希望访问 B 类的私有成员 data,可以将 A 声明为 B 的友元类。

cpp
#include

class B; // 前向声明 B 类

class A {
public:
void displayB(B& b);
};

class B {
private:
int data = 100; // B 的私有数据成员

// 声明 A 类为友元类
friend class A;

public:
int getData() { return data; }
};

// A 类的成员函数可以访问 B 类的私有成员
void A::displayB(B& b) {
std::cout << "B’s private data: " << b.data << std::endl;
}

int main() {
A objA;
B objB;

// A 类的成员函数通过友元关系访问 B 类的私有成员
objA.displayB(objB);

return 0;

}
在上面的例子中:

A 类声明了一个成员函数 displayB,该函数的参数是 B 类的引用。
B 类将 A 声明为友元类,允许 A 类的成员函数 displayB 访问 B 类的私有成员 data。
main 函数中创建了 A 类和 B 类的对象,然后调用 A 类的成员函数 displayB 来显示 B 类的私有数据成员 data。
这些示例展示了友元函数和友元类如何允许非成员函数和外部类访问类的私有成员,从而增强了灵活性和功能性。在实际编程中,友元通常用于一些特定的操作或者跨类的数据交互,但应注意避免滥用,以确保代码的封装性和安全性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值