第四层:友元与函数成员别样定义

news2024/10/7 2:18:42

文章目录

  • 前情回顾
  • 友元
    • 友元的概念
    • 友元的目的
    • 友元的关键字
    • 友元的两种种用法
      • 全局函数做友元
      • 类做友元
  • 函数成员的别样定义
  • 有缘人学友元,急速突破第四层
  • 本章知识点(图片形式)

🎉welcome🎉
✒️博主介绍:一名大一的智能制造专业学生,在学习C/C++的路上会越走越远,后面不定期更新有关C/C++语法,数据结构,算法,Linux,ue5使用,制作游戏的心得,和大家一起共同成长。
✈️C++专栏:C++爬塔日记
😘博客制作不易,👍点赞+⭐收藏+➕关注

前情回顾

上回到,在进入第三层后,我学习了隐藏在编译器内的一种神秘力量——this指针,this指针可以让编译器分清是哪个对象在调用类内的成员函数,同时,随着层数的增高,我对C++的理解越来越深,也越来越发觉C++的恐怖…

友元

“上到这里来,你也是一个有缘人了,老夫看你有大机缘在身,这层内容不难,友元,有缘人祝你好运,哈哈哈哈哈…”这道声音在我踏入到第四层的那一刻响起,“有缘,友元吗?”我小声嘀咕着,看向了面前的石碑上。

友元的概念

在生活中,每个人都有一些可以让大众知道并且访问的,比如名字,也有一些是不想让大众访问的,比如手机、汽车这些私密物品,但是如果经过本人同意,该人的好朋友就可以对私密物品进行访问,同样,在C++中,也有私有属性(private),可以让类外一些特殊的函数或者类进行访问,而这些特殊的函数或者类就需要用到友元。

友元的目的

  • 友元的目的就是让一个函数或者类访问另一个类内的私有成员

友元的关键字

  • 友元的关键字是friend,也就是中文的朋友。

友元的两种种用法

  1. 全局函数做友元
  2. 类做友元

全局函数做友元

当程序员想让全局函数访问一个类内的私有属性时,只需要将函数声明在类内的最上方,并且在函数发返回类型之前加上友元的关键字friend

#include<string>
#include<iostream>
using namespace std;

class person
{
	friend void test1();
public:
	person()
	{
		_name = "张三";
		_car = "奥迪A8";
		_phone = "iphone 100 por max";
	}
	string _name;
private:
	string _car;
	string _phone;
};

void test1()
{
	person p1;
	cout << "现在在访问:" << p1._name << endl;
	cout << "现在在访问:" << p1._name << "的" << p1._car << endl;
	cout << "现在在访问:" << p1._name << "的" << p1._phone << endl;
}
int main()
{
	test1();
	return 0;
}

在这里插入图片描述
那这里可能会有人有疑问,是不是直接在类内声明就可以,不加前面friend是不是也可以访问?实验一下:

#include<string>
#include<iostream>
using namespace std;

class person
{
	void test1();
public:
	person()
	{
		_name = "张三";
		_car = "奥迪A8";
		_phone = "iphone 100 por max";
	}
	string _name;
private:
	string _car;
	string _phone;
};

void test1()
{
	person p1;
	cout << "现在在访问:" << p1._name << endl;
	cout << "现在在访问:" << p1._name << "的" << p1._car << endl;
	cout << "现在在访问:" << p1._name << "的" << p1._phone << endl;
}
int main()
{
	test1();
	return 0;
}

在这里插入图片描述
可以看到报错是不可访问,所以证明,不仅仅需要在类内声明函数还需要加上关键字friend。

类做友元

类做友元,通过表面意思得知,是让一个类做另一个类的友元,然后可以用友元这个类访问把它当作友元的这个类,要注意的来了:

  1. 要访问的话,需要让当作友元这个类成为友元类内的一个对象成员,这个对象成员
    好是个指针,在创建对象时,利用new操作符申请一块对象成员大小的空间让指针指向
  2. 注意,因为使用了new操作符,在程序快要结束的时候,记得使用delete释放空间,并且对指针进行置空,以免造成野指针
#include<string>
#include<iostream>
using namespace std;

class person1;

class person
{
	friend class person1;
public:
	person()
	{
		_name = "张三";
		_car = "奥迪A8";
		_phone = "iphone 100 por max";
	}
	string _name;
private:
	string _car;
	string _phone;
};
class person1
{
public:
	void test()
	{
		cout << "现在访问的是:" << p->_name<< endl;
		cout << "现在访问的是:" << p->_name<< "的" <<  p->_car<< endl;;
		cout << "现在访问的是:" << p->_name << "的" << p->_phone << endl;;
	}
	person *p;
};
void test1()
{
	person1 pp1;
	pp1.p = new person;
	pp1.test();
	delete pp1.p;
	pp1.p = NULL;
}
int main()
{
	test1();
	return 0;
}

在这里插入图片描述

函数成员的别样定义

函数成员其实也可以在类外进行定义,是什么意思呢?其实就是将函数成员在类内进行声明,在类外进行定义,定义时同样要让编译器知道是类内成员,所以也要在函数名前加类名::类外声明写法是

返回值 类名::函数名 ();
当时构造函数时
类名::类名 ();

可以进行验证:

#include<string>
#include<iostream>
using namespace std;

//class person1;
//
class person
{
public:
	person();
	void test1();
	string _name;
	string _car;
	string _phone;
};

person::person()
{
	_name = "张三";
	_car = "奥迪A8";
	_phone = "iphone 100 por max";
}
void person::test1()
{
	cout << "现在访问的是:" << _name << endl;
	cout << "现在访问的是:" << _name << "的" << _car << endl;
	cout << "现在访问的是:" << _name << "的" << _phone << endl;
	
}

int main()
{
	person p1;
	p1.test1();
	return 0;
}

在这里插入图片描述
可以看到时正常运行的。

有缘人学友元,急速突破第四层

巨大石碑轰然倒塌,一阵烟土飘起,散去之后,只见一个声音向第五层走去…

本章知识点(图片形式)

在这里插入图片描述

😘预知后事如何,关注新专栏,和我一起征服C++这座巨塔
🚀专栏:C++爬塔日记
🙉都看到这里了,留下你们的👍点赞+⭐收藏+📋评论吧🙉

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/173159.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python怎么获取节假日信息?

“holidays” 是一个 Python 第三方库&#xff0c;它可以用来解析和处理节假日信息。 该库提供了一系列函数&#xff0c;可以用来检查某一天是否是节假日、获取某一年中所有节假日的列表等。它支持多种国家和地区的节假日&#xff0c;例如美国、加拿大、澳大利亚、英国等。 “…

【软件架构思想系列】分层架构

- 分层架构 -今天谈下架构设计中的分层思想和分层模型。架构思维概述对于架构思维本身仍然是类似系统思维&#xff0c;结构化思维&#xff0c;编程思维等诸多思维模式的一个合集。由于架构的核心作用是在业务现实世界和抽象的IT实现之间建立起一道桥梁&#xff0c;因此…

CUDA编程笔记(4)

文章目录前言1.CUDA的计时程序2.CUDA程序的计时影响GPU加速的关键总结前言 怎么才能看出使用cuda编程&#xff0c;提高了程序的性能&#xff0c;一般都是通过比较程序运行的时间来验证。所以熟悉程序的运行时间的计时&#xff0c;可以查看优化的性能效果。 1.CUDA的计时程序 …

每日亿题(面试题)

每日亿题(面试题) new Fn和new Fn()有什么区别&#xff1f; 1.首先如果是为传参数的情况下结果是相同的 2.如果是获取属性new Fn() 正常执行&#xff0c;而 new Fn 报错 3.不带括号不能给构造函数传参 分析比较 opacity: 0、visibility: hidden、display: none 优劣和适用…

Spring看这一篇文章就够了

第一章 Spring简介 第1节 Spring的介绍 Spring官网地址 1https://spring.ioSpring的介绍 1Spring是一个开放源代码的设计层面框架&#xff0c;他解决的是业务逻辑层和其他各层的松耦合问题&#xff0c;因此它将面向接口的编程思想贯穿整个系统应用。Spring是于2003年兴起的一…

4.2w字,详细的带你认识基础I/O【Linux--基础IO】

前言 相信大家最开始都挺疑惑的&#xff0c;什么I/O。在计算机操作系统中&#xff0c;所谓的I/O实则就是输入&#xff08;Input&#xff09;和输出&#xff08;Output&#xff09;&#xff0c;也可以理解为读&#xff08;Read&#xff09;和写&#xff08;Write&#xff09;&…

Linux常用命令——tar命令

在线Linux命令查询工具(http://www.lzltool.com/LinuxCommand) tar Linux下的归档使用工具&#xff0c;用来打包和备份。 补充说明 tar命令可以为linux的文件和目录创建档案。利用tar&#xff0c;可以为某一特定文件创建档案&#xff08;备份文件&#xff09;&#xff0c;也…

mysql 基本组成

1 mysql 基本组成 1.1、mysql连接器的工作流程: 1.2、查看连接状态: show processlist; Note:客户端太长时间没动静 就自动断开 这个时间是由wait_timeout参数控制的,默认8h 长连接短链接 长连接是链接成功后,如果客户端持续有请求,则使用同一个链接[尽量使用长连接,因为每次…

组件间通信

1、Vue组件的嵌套关系 1.1、认识组件的嵌套 前面我们是将所有的逻辑放到一个App.vue中&#xff1a; 在之前的案例中&#xff0c;我们只是创建了一个组件App&#xff1b;如果我们一个应用程序将所有的逻辑都放在一个组件中&#xff0c;那么这个组件就会变成非常的臃肿和难以维…

【网络通信】【电信运营商实战工程师】思科设备篇-思科设备园区网实战

电信运营商实战工程师系列文章. 思科设备篇-思科设备园区网实战. 文章目录1. 思科设备链路捆绑实战2. 思科设备VRRP、HSRP实战3. 思科设备ACL实战全集4. 思科设备RIP协议实战5. 思科设备OSPF协议全集-理论6. 思科设备OSPF协议全集-实战1. 思科设备链路捆绑实战 知识点&#xff…

【中科微北斗+GPS模块经纬度数据解析详细教程-附免费代码工程】

中科微北斗GPS模块经纬度数据解析详细教程-附免费代码工程简介准备工作PC端需要用到的工具代码下载地址GD32F103C8T6最小系统板代码实现GD32串口引脚定义如下&#xff1a;串口的初始化串口0初始化代码&#xff1a;串口1初始化代码串口的输入串口0的输入代码如下&#xff1a;串口…

嵌入式Linux-线程的开始

1. 线程的开始 1.1 线程的含义 学习了进程相关的知识内容&#xff0c;对进程有了一个比较全面的认识和理解&#xff0c;从今开始呢&#xff0c;我们要学习一个新的概念&#xff0c;叫做线程&#xff01; 那什么是线程呢? 与进程类似&#xff0c;线程是允许应用程序并发执行…

java中的方法2023016

定义方法&#xff08;VS函数&#xff09;&#xff1a; 方法是类或对象的行为特征的抽象&#xff0c;方法是类或对象最重要的组成部分。但从功能上来看&#xff0c;方法完全类似于传统结构化程序设计里的函数。区别是&#xff1a;Java里的方法不能独立存在&#xff0c;所有的方法…

《精力管理》阅读笔记

目录 什么是精力及如何管理精力 高效表现有节奏——劳逸结合的平衡 管理精力的三个步骤 明确目标——知道什么最重要才能全情投入 正视现实——你的精力管理做得如何 付诸行动——积极仪式习惯的力量 精力管理的四个基本原则 体能精力——为身体添柴加火 情感精力——把…

微信小程序----全局数据共享

1.什么是全局数据共享 全局数据共享&#xff08;又叫做:状态管理&#xff09;是为了解决组件之间数据共享的问题。开发中常用的全局数据共享方案有:Vuex、Redux、MobX等。 2.小程序中的全局数据共享方案 在小程序中&#xff0c;可使用 mobx-miniprogram 配合 mobx-miniprog…

【SAP Abap】X档案:SAP Native SQL 简介及本地数据库访问实现方式(EXEC SQL、ADBC、AMDP)

SAP Native SQL 简介及本地数据库访问实现方式&#xff08;EXEC SQL、ADBC、AMDP&#xff09;1、SAP Open SQL 与 Native SQL 的特点2、实现方式方式一&#xff1a;Native SQL&#xff08;Exec SQL&#xff09;&#xff08;1&#xff09;获取单值&#xff08;2&#xff09;获取…

iOS上架appstore详细教材

假如你用原生xcode开发&#xff0c;上架是相对简单。 但假如是用hbuilderx这些uniapp框架开发&#xff0c;没有mac电脑&#xff0c;没有xcode&#xff0c;那么还能上架吗&#xff1f;是可以的&#xff0c;你看完这篇文章&#xff0c;就知道如何在没有mac电脑的情况下&#xff…

【小知识】目标检测各类指标概念总结

文章目录前言一、AP&#xff08;Average Precision&#xff09;1.1 TP&#xff08;True Positive&#xff09;、FP&#xff08;False Positive&#xff09;、FN&#xff08;False Negative&#xff09;1.2 Precision&#xff08;查准率&#xff09;、Recall&#xff08;召回率/…

【LeetCode】Day201-重新安排行程

题目 332.重新安排行程【困难】 题解 这道题的几个难点&#xff1a; 一个行程中&#xff0c;如果航班处理不好容易变成一个圈&#xff0c;成为死循环有多种解法&#xff0c;字母序靠前排在前面&#xff0c;应该如何记录映射关系&#xff1f;使用回溯法&#xff0c;终止条件…

贪心 376. 摆动序列

376. 摆动序列 难度中等827 如果连续数字之间的差严格地在正数和负数之间交替&#xff0c;则数字序列称为 摆动序列 。第一个差&#xff08;如果存在的话&#xff09;可能是正数或负数。仅有一个元素或者含两个不等元素的序列也视作摆动序列。 例如&#xff0c; [1, 7, 4, 9,…