C++ 中友元函数与友元类详解
C++ 中友元函数与友元类详解
总的来说,友元分为两类:友元函数与友元类。友元是针对类而言,它提供了一种非类的成员函数来访问类的非公有成员的一种机制。可以把一个函数指定为某类的友元,这个函数称为这个类的友元函数。也可以将类A指定为类B的友元,则类A是类B的友元类,类A的所有成员函数均是类B的友元函数,均可以访问类B的非公有成员。
友元函数的注意事项:
(1)友元函数不是类的成员函数,在函数体中访问对象的成员,必须用“对象名.对象成员"方式来访问, 友元函数可以访问类中的所有成员(公有,私有,保护),而一般的函数只能访问类的公有成员。
(2)友元函数不受类中的访问权限关键字的限制,可以将它放在类的公有,私有,保护部分,结果均一样。
(3)某类的友元函数的作用域并非该类作用域,如果该友元函数是另一类的成员函数,则其作用域为另一类的作用域,否则与一般函数相同。
(4)友元函数破坏了面向对象设计的封装特性。所以应该尽量少用。
友元类
如果某类B的成员函数会频繁地访问类A的数据成员,而类A的数据成员的private/protected限制造成了类B存取的麻烦,B只能通过A的Public的成员函数进行间接存取。这种情况下可以将类B作为类A的友元类,即类A向类B提供私有和保护成员的访问权限,让类B可以直接存取。
友元类中的所有成员函数均可以看作是另一类的友元函数。
友元类的声明: friend chass 类名;
下面是友元函数的例子
友元函数可以在类中声明,声明时在函数前增加friend关键字,然后在类体外定义,也可以直接在类中声明定义。这两种方式均可。下面例子中采取的是类中声明,类体外定义的方式。
class Point { friend double Distance(const Point &p1, const Point &p2); //类体中声明 public: Point(int x, int y):x_(x), y_(y) {}; private: int x_; int y_; }; //类体外定义友元函数 double Distance(const Point &p1, const Point &p2) { double dx = p1.x_ - p2.x_; //直接访问类的私有成员 double dy = p1.y_ - p2.y_; return sqrt(dx*dx+dy*dy); } int main() { Point p1(3,4); Point P2(6,8); cout << Distance(p1,p2) << endl; return 0; }
下面是友元类的例子:
class Television //电视类 { friend class TeleController;//友元类声明 public: Television(int volume, int chanel): volume_(volume), chanel_(chanel){} private: int volume_; //音量 int chanel_; //频道 }; class TeleController //遥控器类 { public: //类中的每个成员函数都是电视类的友元函数,都可以访问电视类的私有数据成员 void VolumeUp(Television &tv) { tv.volume_ += 1; //音量加1 } void VolumeDown(Television &tv) { tv.volume_ -= 1; } void ChanelUp(Television &tv) { tv.chanel_ += 1; //频道加1 } void ChanelDown(Television &tv) { tv.chanel_ -= 1; //频道减1 } }; int main() { Television tv(1,1); TeleController tc; tc.ChanelUp(tv); return 0; }
友元类需要注意以下几点:
(1)友元关系是单向的;
(2) 友元关系不能被传递: A是B的友元,B是C的友元,则A是C的友元,这种传递不成立
(3) 友元关系不能继承: A是B的友元,A的派生类C也是B的友元,这是不成立的。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
栏 目:C语言
下一篇:C++ 数据结构之kmp算法中的求Next()函数的算法
本文标题:C++ 中友元函数与友元类详解
本文地址:https://www.xiuzhanwang.com/a1/Cyuyan/1420.html
您可能感兴趣的文章
- 04-02c语言没有round函数 round c语言
- 01-10深入理解C++中常见的关键字含义
- 01-10使用C++实现全排列算法的方法详解
- 01-10c++中inline的用法分析
- 01-10用C++实现DBSCAN聚类算法
- 01-10全排列算法的非递归实现与递归实现的方法(C++)
- 01-10C++大数模板(推荐)
- 01-10浅谈C/C++中的static与extern关键字的使用详解
- 01-10深入C/C++浮点数在内存中的存储方式详解
- 01-10深入理解C/C++混合编程
阅读排行
本栏相关
- 04-02c语言函数调用后清空内存 c语言调用
- 04-02func函数+在C语言 func函数在c语言中
- 04-02c语言的正则匹配函数 c语言正则表达
- 04-02c语言用函数写分段 用c语言表示分段
- 04-02c语言中对数函数的表达式 c语言中对
- 04-02c语言编写函数冒泡排序 c语言冒泡排
- 04-02c语言没有round函数 round c语言
- 04-02c语言分段函数怎么求 用c语言求分段
- 04-02C语言中怎么打出三角函数 c语言中怎
- 04-02c语言调用函数求fibo C语言调用函数求
随机阅读
- 01-11ajax实现页面的局部加载
- 01-10delphi制作wav文件的方法
- 01-10C#中split用法实例总结
- 01-11Mac OSX 打开原生自带读写NTFS功能(图文
- 01-10使用C语言求解扑克牌的顺子及n个骰子
- 08-05织梦dedecms什么时候用栏目交叉功能?
- 08-05DEDE织梦data目录下的sessions文件夹有什
- 08-05dedecms(织梦)副栏目数量限制代码修改
- 01-10SublimeText编译C开发环境设置
- 04-02jquery与jsp,用jquery