C++回顾之友元
来源:互联网 发布:数据分析师认证 编辑:程序博客网 时间:2024/05/10 05:35
http://blog.csdn.net/ab198604/article/details/19204045
总的来说,友元分为两类:友元函数与友元类。友元是针对类而言,它提供了一种非类的成员函数来访问类的非公有成员的一种机制。可以把一个函数指定为某类的友元,这个函数称为这个类的友元函数。也可以将类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++回顾之友元
- C++Primer之友元
- C++:友元2(时间之差)
- JNI之C语言简单回顾
- JNI之C语言简单回顾
- JNI之C语言简单回顾
- C语言点滴之回顾篇
- C语言回顾之函数与数组
- NDK开发之C基础回顾2
- 一步一步学习C++(类)之友元函数
- C++(一)友元
- [C++]友元学习
- [c++]友元函数
- [c++] 友元详解
- 【C++】友元函数
- c++:友元函数
- C++:友元函数
- C++回顾之开篇(bool, const限定符,#define, 结构内存对齐)
- 如何激发思考
- java中集合的使用-set,list,map
- PB6.5中TreeView控件使用技巧(转)
- 从头到尾彻底理解KMP(2014年8月22日版)
- C++回顾之友元
- float型数据在内存中的存储形式
- 2015年,成为一名预备党员
- 面朝大海,春暖花开。
- hdu 1505 1506的加强版
- C++回顾之运算符重载
- C++回顾之前置++、后置++、不等号!及赋值运算符重载
- 教你如何迅速秒杀掉:99%的海量数据处理面试题
- uva-201