C++简单又轻松的讲解类和对象中友元函数

 更新时间:2022年06月07日 09:19:21   作者:叶落秋白  
采用类的机制后实现了数据的隐藏与封装,类的数据成员一般定义为私有成员,成员函数一般定义为公有的,依此提供类与外界间的通信接口。但是,有时需要定义一些函数,这些函数不是类的一部分,但又需要频繁地访问类的数据成员,这时可以将这些函数定义为该类的友元函数

友元

用到关键字 friend

浅解概念

举一个非常实际的例子,假如端午节到了你煮了两种粽子,一种是普通的糯米粽子,一种是特殊的五花肉粽子,糯米粽只要是客人都可以品尝,而五花肉棕只限好朋友品尝,这时候就可以用到友元的知识了。在程序里,有些私有属性也想让类外特殊的一些函数或者类访问,就要用到友元函数。

友元目的

让一个函数或者类,访问另一个类的私有属性

友元的三种实现

全局函数、成员函数、类都可以做友元。

全局函数做友元

示例:

class Host    //东家
{
	friend void  FriendFunc(Host& H);
private:
	string m_Precious;
public:
	string m_Common;
	Host() :m_Precious("五花肉粽"), m_Common("糯米粽") {}
};
void VisitFunc(Host &H)
{
	cout << "你的  客人可以吃到你的:" << H.m_Common << endl;
}
void FriendFunc(Host &H)
{
	cout << "你的好朋友可以吃到你的:" << H.m_Precious <<"和"<<H.m_Common<< endl;
}

运行效果:

普通客人函数没有权限访问Host类的私有属性m_Precious ,而好朋友函数在类中加上friend关键字声明就可以访问类内所有成员属性。最好写到类最上面,这样可以在第一时间告诉编译器该全局函数是该类的友元函数。

类做友元

示例:

class Host    //东家 类
{
	friend class  FriendFunc;
private:
	string m_Precious;
public:
	string m_Common;
	Host() :m_Precious("五花肉粽"), m_Common("糯米粽") {}
};
class FriendFunc   //好朋友类
{
public:
	Host* host;
	void visit();
	FriendFunc();
};
void FriendFunc::visit()
{
	cout << "你的好朋友可以吃到你的:" << host->m_Precious << "和" << host->m_Common << endl;
}
FriendFunc::FriendFunc()
{
	host = new Host;
}
void test01()
{
	FriendFunc F;
	F.visit();
}
int main()
{
	test01(); 
}

运行效果:

首先直接copy下来全局函数做友元的Host类,然后把上面的FriendFunc函数变为类;同样在Host类中声明FirstFunc类是其友元类,然后给友元类定义Host类指针,vist访问方法和默认构造函数,这里方法和函数均在类内定义,类外声明;注意:构造函数的声明不需要返回值类型。

友元类的构造函数定义中直接new了一个Host类,当我们调用友元类的默认构造同时调用Host的默认构造函数并通过初始化列表完成自动赋值,这样就可以在visit函数中访问Host类的成员属性了。使用指针的原因就是new的返回值为指针类型,在堆区开辟空间。

成员函数做友元

示例:

#include<iostream>
using namespace std;
class Host;
class FriendFun//好朋友类
{
public:
	FriendFun();
	Host* host;
	void visit();   //让其可以访问Host类的私有成员
	void visit0();  //和visit对比,不能访问Host类私有成员
};
class Host           //东家 类
{
	friend void FriendFun::visit();
private:
	string m_Precious;
public:
	string m_Common;
	Host() :m_Precious("五花肉粽"), m_Common("糯米粽") {}
};
FriendFun::FriendFun()
{
	host = new Host;
}
void FriendFun::visit()   //让其可以访问Host类的私有成员
{
	cout << "你的好朋友可以吃到你的:" << host->m_Precious << "和" << host->m_Common << endl;
}
void FriendFun::visit0()  //和visit对比,不能访问Host类私有成员
{
	cout << "你的好朋友可以吃到你的:" << host->m_Common << endl;
}
void test()
{
	FriendFun F;
	F.visit();
	F.visit0();
}
int main()
{
	test();
}

运行效果:

成员函数作为友元和全局函数作为友元区别就是函数声明的位置不同,同样在Host类里加上friend关键字即可,但是一定要注意函数或者方法声明后定义的位置,死死记住代码是按照顺序执行的。

注意事项

举个例子:如果直接类内定义FriendFun的构造函数,程序会提示你未定义类型Host,为什么呢,我明明在Host类之前声明了啊,确实声明了,也定义了啊,但是编译器来不及看到定义就以及执行了new Host,肯定会报错;按正确的写法就是把构造函数定义写在Host定义之后,这样程序就把定义的Host看完了,就可以自然而然的生成新的成员了;其实visit的定义也必须写在调用FriendFun构造函数之后,因为只有构造生成了新成员,才能访问到公共或者私有属性啊!

总结

学习完这篇快点去定义谁才能获取你五花肉粽子的特权吧,挺有意思的。总体来说友元这块知识不难,但是一定要注意细节,我在总结这里再说一次,代码一定是按照顺序执行的,类内外定义一定要注意顺序,还记得这段知识点,一个bug卡了我两个小时,希望你们能避开我的坑,顺利前行

到此这篇关于C++简单又轻松的讲解类和对象中友元函数的文章就介绍到这了,更多相关C++友元函数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++实现LeetCode(111.二叉树的最小深度)

    C++实现LeetCode(111.二叉树的最小深度)

    这篇文章主要介绍了C++实现LeetCode(111.二叉树的最小深度),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • c++11 实现枚举值到枚举名的转换问题

    c++11 实现枚举值到枚举名的转换问题

    这篇文章主要介绍了c++11 实现枚举值到枚举名的转换,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-03-03
  • C语言 如何用堆解决Topk问题

    C语言 如何用堆解决Topk问题

    TopK问题即在N个数中找出最大的前K个,这篇文章将详细讲解如何利用小根堆的方法解决TopK问题,文中代码具有一定参考价值,快跟随小编一起学习一下吧
    2021-12-12
  • C++读取文本文件中的汉字乱码情况原因及解决

    C++读取文本文件中的汉字乱码情况原因及解决

    本文介绍简体中文Windows操作系统中,C++读取文本文件中的汉字乱码情况原因及解决,文中通过代码和图文给大家介绍的非常详细,具有一定的参考价值,需要的朋友可以参考下
    2024-01-01
  • 利用C/C++二进制读写png文件的方法示例

    利用C/C++二进制读写png文件的方法示例

    最近在做项目的时候遇到了这个问题,所以想着总结下,方法自己和有需要的朋友,下面这篇文章主要介绍了利用C/C++二进制读写png文件的方法,需要的朋友可以参考借鉴,下面来一起看看吧。
    2016-12-12
  • Qt多线程实现网络发送文件功能

    Qt多线程实现网络发送文件功能

    这篇文章主要为大家详细介绍了Qt多线程实现网络发送文件功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • C++实现矩阵对称正交化的示例代码

    C++实现矩阵对称正交化的示例代码

    这篇文章主要介绍了C++实现矩阵对称正交化,分为python代码和C++的eigen库实现代码,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • C语言版的三子棋游戏

    C语言版的三子棋游戏

    这篇文章主要为大家详细介绍了C语言版的三子棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • C语言SetConsoleCursorPosition函数使用方法

    C语言SetConsoleCursorPosition函数使用方法

    这篇文章介绍了C语言SetConsoleCursorPosition函数的使用方法,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-12-12
  • QT实现FTP上传文件

    QT实现FTP上传文件

    这篇文章主要为大家详细介绍了QT实现FTP上传文件,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08

最新评论