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