友元函数C++笔记四:友元
本文笔者在青岛逛街的时候突然想到的...今天就有想写几篇关于友元函数的笔记,所以回家到以后就奋笔疾书的写出来发布了
友元 friend
有时候你须要拜访一个类的所有成员,而这类拜访方法在逻辑上又不是被拜访类的接口。你也不希望破坏类的权限机制。比如你希望能给你的宠物对象取名字(宠物是不会自己取名字的),你又不希望其他人能给你的宠物取名字。这时候友元机制就出来了。你可以在宠物类中指定主人类、你的挚友类为友元。只让他们可以拜访宠物类的名字属性。还有被重载的操作符,经常须要拜访类的私有数据,这些操作又是类的成员。
友元机制允许一个类将其所有成员的拜访权授予指定的函数或类。友元的声明以关键字friend开始,可以出现在类定义的任何地方。由于友元不是类的成员,所以不受类拜访权限机制的影响,也不能通过类来拜访友元(说了它不是类的成员)。
友元函数(普通函数)
1.友元函数不是类的成员,只是一个有特别权限的全局函数。
2.友元函数可以声明在类的任何地方。
3.友元函数的全部定义可以放在所拜访类的定义中,这样的友元函数默以为inline函数。
4.友元函数在类外的定义不要带关键字friend。
5.友元函数必须有一个参数时要拜访类的类型。因为友元函数不是类的成员,必须通过类对象.成员变量的方法来拜访对象的成员变量。
#include <iostream> using std::cout; using std::endl; class CBox // Class definition at global scope { public: // Constructor definition explicit CBox(double lv = 1.0, double bv = 1.0, double hv = 1.0) { cout << endl << “Constructor called.”; m_Length = lv; // Set values of m_Width = bv; // data members m_Height = hv; } // Function to calculate the volume of a box double Volume() { return m_Length*m_Width*m_Height; } private: double m_Length; // Length of a box in inches double m_Width; // Width of a box in inches double m_Height; // Height of a box in inches // Friend function friend double BoxSurface(CBox aBox); }; // friend function to calculate the surface area of a Box object double BoxSurface(CBox aBox) { return 2.0*(aBox.m_Length*aBox.m_Width + aBox.m_Length*aBox.m_Height + aBox.m_Height*aBox.m_Width); } int main() { CBox box2; // Declare box2 - no initial values cout<< “Surface area of box2 = “<< BoxSurface(box2); cout << endl; return 0; }
6.尽管对友元函数声明在类中出现的位置没有限制,当为了便于阅读,类中所有友元函数的位置保持一致。比如都放在public成员和private成员以后。
指定其他类的成员函数成为友元
和普通友元函数一样,只是在声明的时候加上类作用域,指明友元函数所属的类。 比如
friend void A::func(Box&);
指定其他类为友元
指定其他类为友元后,则该其他类的所有成员函数都可以可以拜访授权类的所有成员。
关于成员函数设为友元应注意的声明问题
指定A类的成员函数为B类的友元之前必须先看到A类的定义(注意不是声明)。先定义A时,如果A的这个成员函数要用A类型作参数,则必须先在B类之前声明A是一个类(比必要是定义)。
上面是演示
#include <iostream> using std::cout; using std::endl; class A { public: class B; //声明类B void func(B&); }; void A::func(B&) {//定义类A的成员函数func } class B { friend void A::func(B&); }; int main(void) { return 0; }
上面在类A的定义中在声明了类B。要不然通不过编译。而且A的成员函数func必须先定义,而且不能是内联函数(这意味着不能在类的声明中实现一个成员函数,必须在类定义中声明,类外实现)。
文章结束给大家分享下程序员的一些笑话语录:
IBM和波音777
波音777是有史以来第一架完全在电脑虚拟现实中设计制造的飞机,所用的设备完全由IBM公司所提供。试飞前,波音公司的总裁非常热情的邀请IBM的技术主管去参加试飞,可那位主管却说道:“啊,非常荣幸,可惜那天是我妻子的生日,So..”..
波音公司的总载一听就生气了:“胆小鬼,我还没告诉你试飞的日期呢!”