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

目录
  • 友元
    • 浅解概念
    • 友元目的
  • 友元的三种实现
    • 全局函数做友元
    • 类做友元
    • 成员函数做友元
    • 注意事项
  • 总结

友元

用到关键字 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++友元函数内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 关于C++友元函数的实现讲解

    友元函数是一种特殊的函数,它必须要在类中进行声明,但其本身并不是类的成员函数,但友元函数可以访问类的私有成员变量. 友元函数的好处: 1.实现类之间的数据共享 2.提高程序运行效率,方便编程 友元函数的坏处: 1.破坏数据的隐蔽性和类的封装性 2.降低了程序的可维护性 所有,友元函数应当谨慎的去使用它. 实例: #include <iostream> #include <cstring> using namespace std ; class Student { private :

  • 在C++中关于友元函数的进一步理解

    这里重新将类的成员函数的定义看一下: 百科上的认识: 类的成员函数的原型要写在类体中,原型说明了函数的参数表和返回值类型.而函数的定义一般在类外面,也可以直接在类内部定义.前者与普通函数不同的是,实现成员函数时要指明类的名称,具体形式为: 返回值类型 类名 :函数成员名(参数表){函数体}: 而后者一般为一些短小的函数(5行以内),也就是内联函数. 这里在百科上对友元函数的解释: 友元函数是指某些虽然不是类成员却能够访问类的所有成员的函数.类授予它的友元特别的访问权.通常同一个开发者会出于技术和

  • C++中友元函数(friend)解析

     文章转自公众号:Coder梁(ID:Coder_LT) 我们知道C++控制对象的私有部分的访问,只能通过公共的接口.这样的设计当然没错,但有的时候也会显得过于严格,产生一些问题. 因此C++提供了另外一种形式的访问权限,叫做友元(friend). 友元有三种,分别是友元函数.友元类和友元成员函数. 通过让函数成为类的友元,可以赋予该函数与类成员函数一样的访问权限,也就是说我们可以在友元函数当中访问类的私有成员变量. 在介绍友元函数的使用之前,我们需要先了解为什么需要友元函数.C++ Prime

  • C++实例代码详解友元函数

    目录 友元概述 普通全局函数作为类的友元 类的某个成员函数作为另一个类的友元 一个类整体作为另一个类的友元 友元的注意事项 封装电视机 和遥控器的类 友元函数 可以直接操作类的私有数据. friend关键字在声明处修饰函数 那么该函数就是类的友元. 友元 不是类的一部分. 友元概述 c++允许 友元 访问 私有数据. 友元的语法: friend关键字只出现在声明处 其他类.类成员函数.全局函数都可声明为友元 友元函数不是类的成员,不带this指针 友元函数可访问对象任意成员属性,包括私有属性.

  • C++ 中友元函数与友元类详解

    C++ 中友元函数与友元类详解 总的来说,友元分为两类:友元函数与友元类.友元是针对类而言,它提供了一种非类的成员函数来访问类的非公有成员的一种机制.可以把一个函数指定为某类的友元,这个函数称为这个类的友元函数.也可以将类A指定为类B的友元,则类A是类B的友元类,类A的所有成员函数均是类B的友元函数,均可以访问类B的非公有成员.        友元函数的注意事项: (1)友元函数不是类的成员函数,在函数体中访问对象的成员,必须用"对象名.对象成员"方式来访问, 友元函数可以访问类中的所

  • C++中成员函数和友元函数的使用及区别详解

    为什么使用成员函数和友元函数 这个问题至关重要,直接影响着后面的理解: 程序数据: 数据是程序的信息,会受到程序函数的影响.封装是面向对象编程中的把数据和操作数据的函数绑定在一起的一个概念,这样能避免受到外界的干扰和误用,从而确保了安全. 数据封装引申出了另一个重要的 OOP 概念,即 数据隐藏 .数据封装 是一种把数据和操作数据的函数捆绑在一起的机制, 数据抽象 是一种仅向用户暴露接口而把具体的实现细节隐藏起来的机制.C++ 通过创建类来支持封装和数据隐藏(public.protected.p

  • C++中的友元函数与友元类详情

    目录 一.问题背景 二.友元函数 三.友元类 一.问题背景 对类的封装是C++三大特性中的一个重要特性,封装好的数据在类的外部是访问不到的但是一旦出了问题,想要操作被封装的数据怎么办呢?由此友元函数友元类诞生了.在类中用friend关键字声明的函数或类,可以对类体中的任何权限成员属性进行操作有好处就有坏处友元函数.友元类严重破坏类的封装性,不到迫不得已不要使用. 二.友元函数 声明部分: friend 返回类型 函数名 (参数列表); 定义部分:返回类型 函数名 (参数列表){        函

  • 简要介绍C++编程中的友元函数和友元类

    一个类中可以有 public.protected.private 三种属性的成员,通过对象可以访问 public 成员,只有本类中的函数可以访问本类的 private 成员.现在,我们来补充介绍一个例外--友元(friend). fnend 的意思是朋友,或者说是好友,与好友的关系显然要比一般人亲密一些.有的家庭可能会这样处理:客厅对所有来客开放,而卧室除了本家庭的成员可以进人以外,还允许好朋友进入.在C++中,这种关系以关键宇 friend 声明,中文多译为友元.友元可以访问与其有好友关系的类

  • C++友元函数与拷贝构造函数详解

    一.友元函数 1.友元函数概述: (1)友元函数是定义在一个类外的普通函数. 友元函数和普通函数的定义一样;在类内必须将该普通函数声明为友元. (2)友元函数不是成员函数. 不能通过对象来调用,而是直接调用;友元函数可以访问类的公有.受保护以及私有成员,但是必须通过对象.对象指针或者对象引用来访问. 2.友元函数的声明: friend 返回值类型 函数名(参数表); 在类中只需要将这个声明放置在公有部分即可. class Point { double x, y; public: Point(){

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

    目录 友元 浅解概念 友元目的 友元的三种实现 全局函数做友元 类做友元 成员函数做友元 注意事项 总结 友元 用到关键字 friend 浅解概念 举一个非常实际的例子,假如端午节到了你煮了两种粽子,一种是普通的糯米粽子,一种是特殊的五花肉粽子,糯米粽只要是客人都可以品尝,而五花肉棕只限好朋友品尝,这时候就可以用到友元的知识了.在程序里,有些私有属性也想让类外特殊的一些函数或者类访问,就要用到友元函数. 友元目的 让一个函数或者类,访问另一个类的私有属性 友元的三种实现 全局函数.成员函数.类都

  • Java全面细致讲解类与对象

    目录 类和对象的关系 类和对象的实例化 static关键字 private实现的封装 构造方法 this关键字 代码块 匿名对象 小结 类和对象的关系 类就是一类对象的统称.对象就是这一类具体化的一个实例. (对象是类的实例化) 对象是什么? 此对象非彼对象!!!说到对象就要提到过程. 面向过程:C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题.面向过程注重的是过程,在整个过程中所涉及的行为,就是功能. 面向对象:JAVA是基于面向对象的,关注的是对象,将一件事情

  • C++深入讲解类与对象之OOP面向对象编程与封装

    目录 1.面向对象编程 2.面向过程性编程和面向对象编程 3.类的引入 4.类的定义 4.1类的两种定义方式 4.1.1声明和定义全部放在类体中 4.2.2.声明和定义不放在类体中 5.类的访问限定符及封装 5.1 访问限定符 5.2封装 6.类的作用域 7.类的实例化 8.类对象模型 如何计算类对象的大小 面向过程编程也叫结构化编程.虽然结构化编程的理念提高了程序的清晰度,可靠性,并且方便维护.但它再编写大型的程序时,仍然面临这巨大的挑战,OOP(面向对象编程)提供了一种新的方法.与强调算法的

  • PHP类和对象相关系统函数与运算符小结

    本文总结了PHP类和对象相关系统函数与运算符.分享给大家供大家参考,具体如下: 系统函数 class_exists() 判断某个类是否存在 interface_exists() 判断接口是否存在 get_class() / __CLASS__ 获取某个对象所处的类名 get_parent_class() 获取某个对象所属父类的类名 get_class_methods() 获取一个类所有方法,返回索引数组 get_class_vars() 获取一个类所有属性,下标为属性名 get_declared

  • C++深入探究类与对象之友元与运算符重载

    目录 友元 1 全局函数做友元 2 类做友元 3 成员函数做友元 运算符重载 1 加号运算符重载 2 左移运算符重载 3 递增运算符重载 4 赋值运算符重载 5 关系运算符重载 6 函数调用运算符重载 友元 生活中你的家有客厅(Public),有你的卧室(Private),客厅所有来的客人都可以进去,但是你的卧室是私有的,也就是说只有你能进去,但是呢,你也可以允许你的好闺蜜好基友进去. 在程序里,有些私有属性也想让类外特殊的一些函数或者类进行访问,就需要用到友元的技术. 友元的目的就是让一个函数

  • PHP类与对象中的private访问控制的疑问

    复制代码 代码如下: class Bar { public function test() { $this->testPrivate(); $this->testPublic(); } public function testPublic() { echo "Bar::testPublic\n"; } private function testPrivate() { echo "Bar::testPrivate\n"; } } class Foo ext

  • 从C语言中读取Python 类文件对象

    问题 你要写C扩展来读取来自任何Python类文件对象中的数据(比如普通文件.StringIO对象等). 解决方案 要读取一个类文件对象的数据,你需要重复调用 read() 方法,然后正确的解码获得的数据. 下面是一个C扩展函数例子,仅仅只是读取一个类文件对象中的所有数据并将其输出到标准输出: #define CHUNK_SIZE 8192 /* Consume a "file-like" object and write bytes to stdout */ static PyObj

  • C++中友元类和嵌套类使用详解

    目录 前言 1. 友元类 2. 友元成员函数 3. 其他友元关系 3.1 成为彼此的友元类 3.2 共同的友元 4. 嵌套类 嵌套类的作用域和访问控制 作用域 前言 友元这个词,在学习类的时候肯定接触过,但是当时我们只用了很多友元函数. 友元有三种: 友元函数 友元类 友元类方法 类并非只能拥有友元函数,也可以将类作为友元.在这种情况下,友元类的所以方法都能访问原始类的私有成员和保护成员.另外,也可以做更严格的限制,只将特定的成员函数指定为另一个类的友元. 1. 友元类 假如我们有两个类:Tv电

  • js 用于检测类数组对象的函数方法

    如下所示: //判定o是否是一个类数组对象 //字符串和函数有length属性,但是它们 //可以用typeof检测将其排除.在客户端JavaScript中,DOM文本节点 //也有length属性,需要用额外判断o.nodeType!=3将其排除 function isArrayLike(o){ if(o&&//o非null/undefined等 typeof o==="object"&&//o是对象 isFinite(o.length)&&a

随机推荐