龙空技术网

C++中的友元(C++ friend)

漫漫编程路 221

前言:

此刻看官们对“java友元”大约比较着重,小伙伴们都想要了解一些“java友元”的相关内容。那么小编也在网摘上汇集了一些有关“java友元””的相关知识,希望姐妹们能喜欢,兄弟们一起来学习一下吧!

什么是友元

C++规定私有成员只能在类的成员函数内部访问,如果想在别处访问对象的私有成员,只能通过类提供的接口(成员函数)间接地进行。这固然能够带来数据隐藏的好处,利于将来程序的扩充,但也会增加程序书写的麻烦。

C++ 设计者们认为,如果有的程序员真的非常怕麻烦,就是想在类的成员函数外部直接访问对象的私有成员,那还是做一点妥协以满足他们的愿望为好,这也算是眼前利益和长远利益的折中。因此,C++ 就有了友元(friend)的概念,简单点理解就是:朋友是值得信任的,所以可以对他们公开自己的隐私。

相比与c++而言,java就直接去掉了友元。C++由于是从结构化的C语言发展而来的,需要照顾结构化设计程序员的习惯,所以在对私有成员可访问范围的问题上不可限制太死。

友元分两种:友元类、友元函数。

友元类友元类定义

一个类 A 可以将另一个类 B 声明为自己的友元,类 B 的所有成员函数就都可以访问类 A 对象的私有成员。在类定义中声明友元类的写法为:

friend class 类名;
友元类使用示例
class CCar {private:    int price;    friend class CDriver;  };class CDriver {public:    CCar myCar;    void ModifyCar() {         myCar.price += 1000;      }};

第 4 行使得 CDriver 类的所有成员函数都能访问 CCar 对象的私有成员。如果没有第 5 行,第 10 行对 myCar 私有成员 price 的访问就会导致编译错误。

友元类的特点

1)一般来说,类 A 将类 B 声明为友元类,则类 B 最好从逻辑上和类 A 有比较接近的关系。例如上面的例子,CDriver 代表司机,CCar 代表车,司机拥有车,所以 CDriver 类和 CCar 类从逻辑上来讲关系比较密切,把 CDriver 类声明为 CCar 类的友元比较合理。

2)友元类不具备传递性,即类 A 是类 B 的友元,类 B 是类 C 的友元,并不能导出类 A 是类 C 的友元。

友元函数友元函数定义

在定义一个类的时候,可以把一些函数(包括全局函数和其他类的成员函数)声明为“友元”,这样那些函数就成为该类的友元函数,在友元函数内部就可以访问该类对象的私有成员了。

将全局函数声明为友元的写法为:

friend 返回值类型 函数名(参数表);

将其他类的成员函数声明为友元的写法为:

friend 返回值类型 其他类的类名::成员函数名(参数表);

注意:不能把其他类的私有成员函数声明为友元。

友元函数示例

#include<iostream>using namespace std;class CCar;  //提前声明CCar类,以便后面的CDriver类使用class CDriver {public:    void ModifyCar(CCar* pCar);  };class CCar {private:    int price;    friend int MostExpensiveCar(CCar cars[], int total);  //声明友元    friend void CDriver::ModifyCar(CCar* pCar);  //声明友元};void CDriver::ModifyCar(CCar* pCar) {    pCar->price += 1000;  }int MostExpensiveCar(CCar cars[], int total) {     int tmpMax = -1;    for (int i = 0; i<total; ++i)        if (cars[i].price > tmpMax)            tmpMax = cars[i].price;    return tmpMax;}

第 12 行将全局函数 MostExpensiveCar 声明为 CCar 类的友元,因此在第 21 行可以访问 cars[i] 的私有成员 price。同理,第 14 行将 CDriver 类的 ModifyCar 成员函数声明为友元,因此在第 18 行可以访问 pCar 指针所指向的对象的私有成员变量 price。

总结

友元,看起来很灵活但是也使得面向对象变得更加凌乱,使用友元的代码往往很难阅读与维护,所以对于新开发的代码还是应该像java语言那样,将需要对外使用的私有变量通过成员函数来暴露出去,而尽量少使用友元。

标签: #java友元 #友元函数是成员函数在其中能直接访问私有成员