阅读背景:

全局函数、类成员函数 作为友元函数

来源:互联网 

全局函数、类成员函数 作为友元函数

#include "stdafx.h"
#include <iostream>
using namespace std;


#if  0

同类对象间无私处
异类对象间有友员

//函数(可以是全局函数,也可是类成员函数)可以作友元,称为友元函数
//友元的位置在类中哪个位置都可以 可以在private也可以在public

----前向声明(forward declaration):
是一种不完全型声明,
即只需提供类名(无需提供类实现)即可。 例如 class A;  class B;

前向声明功能有限 :
(1)不能定义类的对象。(因为不知道对象的大小,确定不了空间)

(2)可以用于定义指向这个类型的指针或引用(因为指针和引用的大小确定,可以生成)

(3)用于声明(不是定义),使用该类型作为形参类型或者函数的返回值类型


友元的本质,是让其它不属于本类的成员(全局函数,其它类的成员函数) 成为类的成
员而具备了本类成员的属性
但仍然需要利用该类的对象去访问该类的数据成员

声明为哪个类的友元,就可以通过哪个类的对象访问其私有成员

#endif


class A; //前向声明

class B
{
public:
	//前向声明可以定义引用,所以可以将A进行前向声明 
	void dis(A &t);
	//但前向声明只能确定在此开辟的空间大小 却看不见数据成员x y z
	//所以需要只在此处声明,而实现则放到 类A中的 x y z都声明完之后
};


class A
{
public:
	//friend void dis(A&t); 等价于 friend void ::dis(A&t);全局函数 命名空间为空
	friend void B::dis(A &t);
	//此处用到B了 但它不是*或者&类型,所以将B进行前向声明不起作用

private:
	int x;
	int y;
	int z;
};


void B::dis(A &t)
{
	cout << t.x << t.y << t.z << endl;
}

//全局函数
//void dis(A &t)
//{
//	cout << t.x << t.y << t.z << endl;
//}



int _tmain(int argc, _TCHAR* argv[])
{
	A a;

	B b;

	for (int i = 0; i < 1000; i++)
		b.dis(a); //对象a可以通过B类的函数访问A类的数据

}#include "stdafx.h"
#inc



你的当前访问异常,请进行认证后继续阅读剩余内容。

分享到: