栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++,友元函数,友元类,友元成员函数

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++,友元函数,友元类,友元成员函数

友元是什么?
  • 友元的概念
  • 友元函数
    • 一、友元函数
    • 二、友元类
    • 三、友元成员函数
  • 友元与封装性

注释:运行环境为g++

友元的概念

在我们定义类的时候由于一些私密的数据不想被外界所访问我们通常设置为私有的这是为了提高代码的维护性和封装性。私有成员只能在类的成员函数内部访问,如果想在别处访问对象的私有成员,只能通过类提供的接口(成员函数)间接地进行。这固然能够带来数据隐藏的好处,利于将来程序的扩充,但也会增加程序书写的麻烦。
c++提供了set/get方法但如果我们有一些数据需要频繁的调用的时候就会增大时间开销,例如:

#include

using namespace std;

class member
{
public:
	void setNum(int num) 
	{
		m_num = num;
	}

	int getNum()
	{
		return m_num;
	}
private:
	int m_num;
};
int main()
{
	member t;
	t.setNum(10);
	for (int i = 0; i < 1000; i++)
	{
		//cout< 

但我们有没有方法可以直接访问到类里面的私有数据呢?于是友元(friend) 诞生了。打个比方,这相当于是说:朋友是值得信任的,所以可以对他们公开一些自己的隐私。

友元函数 一、友元函数

在面向对象编程中,友元函数(friend function)是一个指定类(class)的“朋友”,该函数被允许访问该类中private、protected、public的数据成员。普通的函数并不能访问这些数据,然而声明一个函数成为一个类的友元函数则被允许访问这些数据。

友元函数的宣告可以放在类声明的任何地方,不受访问限定关键字private、protected、public的限制。一个相似的概念是友谊类。

#include

using namespace std;

class member
{
public:
	member()
	{
	}
	friend void fun(const member& t);//声明友元函数
private:
	int m_num;
};

void fun(const member& t)
{
	cout << t.m_num << endl;//此时一个非成员函数也可以访问到member类里面的私有成员
}

int main()
{
	member t;
	t.setNum(10);

	return 0;
}
二、友元类

类A作为类B的友元时,类A称为友元类。A中的所有成员函数都是B的友元函数,都可以访问B中的所有成员。

A可以在B的public部分或private部分进行声明,方法如下:
friend [class]<类名>; //友元类类名

#include

using namespace std;

class member
{
public:
	void setNum(int num)
	{
		m_num = num;
	}
	friend class p_member;//声明p_member是member类的友元
private:
	int m_num;
};

class p_member
{
public:
	void func(member& t);
private:
	int m_num1;
};

void p_member::func(member& t)
{
	cout << t.m_num << endl;
}

int main()
{
	member t;
	t.setNum(10);
	p_member t1;
	t1.func(t);

	return 0;
}

将整个p_member声明为member类的友元,此时p_member里的成员函数就可以访问member类中的私有数据。

三、友元成员函数

A类的成员函数作为B类的友元函数时,必须先定义A类,而不仅仅是声明它。

注意:将其他类的成员函数申明为本类的友元函数后,该友元函数并不能变成本类的成员函数。也就是说,朋友并不能变成家人。

#include

using namespace std;
class Text;//前置声明;

class B
{
public:
    void print2(Text& aa);
};

class Text
{
public:
    Text()
    {

    }
    Text(int num) :num(num)
    {

    }
    ~Text()
    {

    }
    //friend class B;//声明整个b是Ttext的友元
    friend void B::print2(Text& aa);

private:
    int num;
};

void B::print2(Text& aa)
{
    cout << aa.num << endl;
}

int main()
{
    Text t(5);
    B t1;
    t1.print2(t);

    return 0;
}
友元与封装性

优点:提高了程序的运行效率。

缺点:破坏了类的封装性和数据的透明性。

对于一些需要频繁调用的数据和函数使用友元可以提高程序的运行效率但是却破坏了c++的封装性。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/347137.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号