C++友元

介绍

(PS:所有的函数声明与定义,一定是 声明在前 定义在后)
本文介绍友元其作用和用法(关键词:friend )

  • 什么叫友元
    1.通过友元可以访问 其他类 中所有成员(所有成员:包括私有成员函数和成员变量)
  • 怎么用友元
    1.在 类 外定义“函数”或者“类”,在 其它类 中声明“函数”或者“类”的原型前面加上关键词“friend”
    使用例子:
    friend class print3D;//友元类
    friend void print_2D(print2D &print);//友元函数
  • 注意事项
    1.声明友元函数后 可以访问“当前类”中所有成员
    2.友元函数 不属于“当前类”,不是当前类的“成员函数”
    3.友元 的关系是单向的(PS:不是双向的)
    4.一般不建议把整个类声明成友元类,除非 特殊需求
    5.友元只可以访问其初始化值,且不影响 当前类 中函数或者变量(PS:下面有例题)

例题

#include

using namespace std;
/*****************************************************************************
5.友元只可以访问其初始化值,且不影响 当前类 中函数或者变量
(相当于只提供访问,且只获取到初始变量)
*****************************************************************************/
class print2D
{
public:
	friend void print_2D(print2D &print);//声明一个友元函数
	print2D(int x = 2, int y = 3) :m_x(x), m_y(y){}//print2D构造初始化

private:
	int m_x;
	int m_y;
};

void print_2D(print2D &print)
{
	//此处访问 print2D 只会获取初始化值print.m_x = 20,print.m_y = 3
	cout << "print<" << print.m_x << "," << print.m_y << ">" << endl;
}

void main()
{
	print2D P_24(20);//此处只传入一个值 x
	print_2D(P_24);//友元函数print_2D
	system("pause");
}

源码

#include

using namespace std;
/******************
友元关键词 friend
******************/
//class print3D;//此处声明 下类以防friend void print_3D(print3D &print);这一段中 print3D 无法识别(PS:如果已经在类中声明过友元print3D则不需要在全局重新声明print3D)
class print2D
{
	//声明一个友元函数(这个友元函数可以访问这个类里面 所有成员)
	friend void print_2D(print2D &print);
	//声明一个友元类
	friend class print3D;
	//声明一个 print3D 中的友元函数
	friend void print_3D(print3D &print);

public:
	//缺省构造函数(PS:此处能形成三种不同的重载)
	print2D(int x = 0, int y = 0) :m_x(x), m_y(y){}
	void print()//打印坐标函数
	{
		cout << "print<" << m_x << "," << m_y <<">"<< endl;
	}
private:
	int m_x;
	int m_y;
};

class print3D
{
	friend void print_3D(print3D &print);
public:
	//初始化(此处初始化不能同print2D构造函数一样初始化)
	print3D(int z)
	{
		m_z = z;
	}
	void print()
	{
		cout << "print<" << P_2D.m_x << "," << P_2D.m_y << ">" << endl;
	}
private:
	print2D P_2D;//如果需要调用print2D中的变量需要在print2D中声明友元
	int m_z;
};
//函数定义print_2D
void print_2D(print2D &print)
{
	cout << "print<" << print.m_x << "," << print.m_y << ">" << endl;
}
//函数定义print_3D(此处需要先在print3D中声明友元,然后print2D中声明友元)
void print_3D(print3D &print)
{

	cout << "print<" << print.P_2D.m_x << "," << print.P_2D.m_y << "," << print.m_z << ">" << endl;
}
void main()
{
//重载 and 构造
	print2D P_21;//第一次重载
	P_21.print();

	print2D P_22(10);//第二次重载
	P_22.print();

	print2D P_23(10,30);//第三次重载
	P_23.print();
	cout << "-----------分界线-----------" << endl;
//友元的使用
	print2D P_24(40,50);//第三次重载
	print_2D(P_24);//此处使用的是友元函数

	print3D P_31(60);//此处使用的是友元 类
	P_31.print();//print3D类中函数

	print_3D(P_31);//友元函数

	system("pause");
}

运行结果

print<0,0>
print<10,0>
print<10,30>
-----------分界线-----------
print<40,50>
print<0,0>
print<0,0,60>
请按任意键继续. . .

你可能感兴趣的:(C++学习参考,c++,学习,笔记)