C++之友元
程序员文章站
2024-02-01 13:55:40
类可以允许其他类或者函数访问他的非公有成员,方法是令其他类或者函数成为他的友元(friend)。 友元的声明: 友元声明只能出现在类的内部,但是在类内出现的具体位置不限;由于友元不是类的成员,所以不受所在区域访问控制级别的约束。 友元的声明并非传统意义上的声明,所以为了能够正确的调用该友元函数,还须 ......
类可以允许其他类或者函数访问他的非公有成员,方法是令其他类或者函数成为他的友元(friend)。
友元的声明:
友元声明只能出现在类的内部,但是在类内出现的具体位置不限;由于友元不是类的成员,所以不受所在区域访问控制级别的约束。
友元的声明并非传统意义上的声明,所以为了能够正确的调用该友元函数,还须在类的外面独立声明该函数。
令函数作为友元:
如果想要让一个外部函数add使用类a的非公有成员,可以让函数add做类a的友元函数,例如:
class a{ friend void add(); //类a的剩余部分; }
注:因为add()函数是类a的友元函数,所以可以在add()函数的定义中使用类a的非公有成员,但是必须是先定义类a,包括对于add的友元声明;然后再定义add函数,此时它才能使用类a的成员。
令类作为友元:
如果想要让类b使用类a的非公有成员,可以让类b做类a的友元类,例如:
class a{ friend class b; //类a的剩余部分; }
注:友元关系不存在传递性,例:类b是类a的友元类,函数c是类b的友元函数,但是函数c并不能访问类a的非共有成员。
缺点:这会导致类b中的每个成员函数(包括稍后添加的函数)都可以访问类a的私有成员,所以,最好只把需要访问类a私有成员的成员函数声明为友元。
令成员函数作为友元:
为了解决类作为友元的缺陷,我们可以让特定的类成员函数作为友元,例如:
class a{ friend void b::add(); //类a的剩余部分; }
注:在把成员函数作为友元时需要注意类a、类b、成员函数add的声明以及定义顺序。
函数重载:
由于重载函数仍然是不同的函数,因此,如果想要把一组重载函数都声明成友元,则需要对这组函数中的每一个分别声明,例如:
void add(); int add(); class a{ friend void add(); //类a的剩余部分; }
只有返回值为void的add函数能使用类a的非公有成员。
推荐阅读
-
首款A14产品:苹果本周五要开卖iPad Air 4 国行4799元起
-
苹果中国即将发售Powerbeats Pro:1888元
-
C++之友元
-
畅玩单机大作 5000元i5-4590/igame750ti独显游戏电脑配置清单推荐
-
电脑出现microsoft visual c++ runtime error 解决方法
-
全新iPad Pro发布:A12X仿生芯片加持 顶配售价达15299元
-
入门级实用装机 2套千元级APU电脑配置清单推荐
-
大型游戏与VR游戏通吃 6500元六代i7-6700/GTX970高端组装电脑配置清单推荐
-
iOS音频开发之资源(AVAsset)与元数据,解决获取资源属性问题(三)
-
售价199元 宅男神器迅雷下载宝全面评测