100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > C++友元函数和友元类(C++ friend)详解

C++友元函数和友元类(C++ friend)详解

时间:2023-02-11 08:13:49

相关推荐

C++友元函数和友元类(C++ friend)详解

在看VISP视觉库的时候遇到友元函数:

Friendsvoid swap (vpDetectorAprilTag &o1, vpDetectorAprilTag &o2)

在定义一个类的时候,可以把一些函数(包括全局函数和其他类的成员函数)声明为“友元”,这样那些函数就成为该类的友元函数,在友元函数内部就可以访问该类对象的私有成员了。将全局函数声明为友元的写法如下: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;}int main(){return 0;}

这个程序只是为了展示友元的用法,所以 main 函数什么也不做。

第 3 行声明了 CCar 类,CCar 类的定义在后面。之所以要提前声明,是因为 CDriver 类的定义中用到了 CCar 类型(第7行),而此时 CCar 类还没有定义,编译会报错。

不要第 3 行,而把 CCar 类的定义写在 CDriver 类的前面,是解决不了这个问题的,因为 CCar 类中也用到了 CDriver 类型(第14行),把 CCar 类的定义写在前面会导致第 14 行的 CDriver 因没有定义而报错。C++ 为此提供的解决办法是:可以简单地将一个类的名字提前声明,写法如下:

class 类名;

尽管可以提前声明,但是在一个类的定义出现之前,仍然不能有任何会导致该类对象被生成的语句。但使用该类的指针或引用是没有问题的。

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

友元类

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

friend class 类名;

用法如下:

class CCar{private:int price;friend class CDriver; //声明 CDriver 为友元类};class CDriver{public:CCar myCar;void ModifyCar() //改装汽车{myCar.price += 1000; //因CDriver是CCar的友元类,故此处可以访问其私有成员}};int main(){return 0;}

第 5 行将 CDriver 声明为 CCar 的友元类。这条语句本来就是在声明 CDriver 是一个类,所以 CCar 类定义前面就不用声明 CDriver 类了。第 5 行使得 CDriver 类的所有成员函数都能访问 CCar 对象的私有成员。如果没有第 5 行,第 13 行对 myCar 私有成员 price 的访问就会导致编译错误。

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

友元关系在类之间不能传递,即类 A 是类 B 的友元,类 B 是类 C 的友元,并不能导出类 A 是类 C 的友元。“咱俩是朋友,所以你的朋友就是我的朋友”这句话在 C++ 的友元关系上 不成立。

原文:C++友元函数和友元类(C++ friend)详解

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。