本文笔者在青岛逛街的时候突然想到的...今天就有想写几篇关于友元函数的笔记,所以回家到以后就奋笔疾书的写出来发布了

           友元 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..”..
  波音公司的总载一听就生气了:“胆小鬼,我还没告诉你试飞的日期呢!”