【C++】类和对象(五)友元、内部类、匿名对象

前言:前面我们说到类和对象是一个十分漫长的荆棘地,今天我们将走到终点,也就是说我们对于C++算是正式的入门了。

💖 博主CSDN主页:卫卫卫的个人主页 💞
👉 专栏分类:高质量C++学习 👈
💯代码仓库:卫卫周大胖的学习日记💫
💪关注博主和博主一起学习!一起努力!
在这里插入图片描述


目录标题

  • 类和对象
    • 友元
    • 内部类
      • 通过外部类使用内部类
      • 内部类是外部类的友元
      • 外部类无法直接访问内部类的成员
    • 匿名对象


类和对象

友元

友元是 C++ 中的一个特殊声明,允许一个类或函数访问另一个类的私有成员或受保护成员。友元的声明可以在类中出现,也可以在类外出现。

  • 友元关系是单向的,不具有交换性。
  • 友元关系不能传递如果C是B的友元, B是A的友元,则不能说明C时A的友元。
  • 友元关系不能继承,在继承位置再给大家详细介绍。

友元函数: 友元函数是在类外部声明的函数,它可以直接访问类的私有成员或受保护成员。在类中声明一个函数为友元函数,需要使用 friend 关键字。
友元类: 友元类是在一个类中声明的另一个类,被声明为友元类的类可以访问该类的私有成员或受保护成员。在类中声明一个类为友元类,需要使用 friend 关键字

class A {
private:
    int x;
public:
    friend class B; // 声明类 B 是类 A 的友元
    friend void func(); // 声明函数 func 是类 A 的友元
    A(int n = 10)
    {
        x = n;
    }
};

class B {
public:
    void printA(A obj) {
        cout <<"友元类访问私有成员:" << obj.x << endl; // 类 B 可以访问类 A 的私有成员 x
    }
};

void func() {
    A obj(1);
    cout <<"func函数访问的私有成员: " << obj.x << endl; // 函数 func 可以访问类 A 的私有成员 x
}

int main()
{
    A obj(5);
    func();//友元函数可以访问类中的私有成员
    B obj1;
    obj1.printA(obj);//类 B 可以访问类 A 的私有成员 x
    return 0;
}

在这里插入图片描述
友元关系是单向的,即如果类 A 是类 B 的友元,不代表类 B 是类 A 的友元,需要分别进行声明。

注意,过度使用友元会破坏封装性,并增加代码的复杂性和耦合性,因此在使用友元时应慎重考虑。


内部类

概念:如果一个类定义在另一个类的内部,这个内部类就叫做内部类。内部类是一个独立的类,它不属于外部类,更不能通过外部类的对象去访问内部类的成员。外部类对内部类没有任何优越的访问权限。
注意:内部类就是外部类的友元类,参见友元类的定义,内部类可以通过外部类的对象参数来访问外部类中的所有成员。但是外部类不是内部类的友元。

通过外部类使用内部类

在下面的示例中,Inner是一个内部类,Outer是一个外部类.
实例演示:

class Outer
{
public :
	Outer(int s = 1, int q = 1)
		:m(s)
		,n(q)
	{
	}
	void Print()
	{
		cout << "你好我是外部类 : " << m << " " << n << endl;

	}
	class Inner
	{
	public:
		Inner(int n = 1, int m = 1)
			:x(n)
			,y(m)
		{
		}
		void Print()
		{
			cout << "你好我是内部类 : " << x << " " << y << endl;
		}
	private :
		int x;
		int y;
	};
private :
	int m;
	int n;
};

int main()
{
	Outer outobj(9, 22);
	Outer::Inner inobj(10,20);//外部使用内部类
	inobj.Print();
	outobj.Print();
	return 0;
}

在这里插入图片描述


内部类是外部类的友元

实例演示
在这里插入图片描述

外部类无法直接访问内部类的成员

实例演示:
在这里插入图片描述


总结
C++中的内部类指的是在一个类的内部定义的类。内部类具有以下特点:

  1. 内部类是一个嵌套在外部类中的类,它们之间可以互相访问彼此的成员。

  2. 内部类可以访问外部类的所有成员,包括私有成员。

  3. 内部类的对象可以在外部类的成员函数中直接创建。

  4. 内部类的作用域被限定在外部类中,外部类的成员函数可以访问内部类,但外部类的对象不能直接访问内部类。

  5. 内部类可以使用外部类的成员作为自己的成员,从而实现更灵活的设计和封装。

  6. 内部类可以被声明为私有,这样只有外部类的成员函数可以访问它。

  7. 内部类的声明可以在外部类的定义之外,但定义必须在外部类的定义之内。

  8. . sizeof(外部类)=外部类,和内部类没有任何关系。


匿名对象

C++中的匿名对象是指没有被命名的对象,它们在创建后可以直接使用,但无法通过变量名来引用。匿名对象通常用于简单的一次性操作或者作为函数的参数。
匿名对象的特点如下

  1. 匿名对象在创建后立即执行相关操作,并在表达式结束后被销毁
  2. 匿名对象无法被引用,因此无法在其他地方被使用。
  3. 匿名对象适用于一些临时的、不需要保留状态的操作,如简单的计算或调用函数。
    实例演示1
class Myclass
{
public:
    Myclass(int year = 2024, int month = 1, int day = 1)
        :_year(year)
        ,_month(month)
        ,_day(day)
    {
    }
    void Print()
    {
        cout << "year: " << _year << " month: " << _month << " day: " << _day << endl;
    }
private:
    int _year;
    int _month;
    int _day;
};
int main()
{
    Myclass(2024, 2, 16).Print();//调用匿名对象
    Myclass A = 2023;//这里会产生隐式转换
    A.Print();
    Myclass B;调用一次构造函数
    B.Print();
    B = Myclass(2003, 9, 22);//此处等价于赋值,且这个匿名对象会调用一次给构造函数
    B.Print();
	return 0;
}

在这里插入图片描述


匿名对象在以下情况下会调用拷贝构造、默认构造和析构函数

如果生成的匿名对象在外部有对象等待被其实例化,此匿名对象的生命周期就变成了外部对象的生命周期;如果生成的匿名对象在外面没有对象等待被其实例化,此匿名对象将会生成之后,立马被析构。
好啦,今天的内容就到这里啦,下期内容预告类和对象(五)友元、内部类、匿名对象等,下期就会对类和对象进行最后的收尾了,各位加油呐!


好啦,今天的内容就到这里啦,下期内容预告C/C++内存管理,类和对象就在这里和大家告一段落了,各位加油呐!


结语:今天的内容就到这里吧,谢谢各位的观看,如果有讲的不好的地方也请各位多多指出,作者每一条评论都会读的,谢谢各位。


🌏🗺️ 这里祝各位新年快乐 💞💞

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C#根据权重抽取随机数

&#xff08;游戏中一个很常见的简单功能&#xff0c;比如抽卡抽奖抽道具&#xff0c;或者一个怪物有多种攻击动作&#xff0c;按不同的权重随机出个攻击动作等等……&#xff09; 假如有三种物品 A、B、C&#xff0c;对应的权重分别是A&#xff08;50&#xff09;&#xff0c…

寒假项目-酒店综合管理系统

目前所学的东西依然很有限&#xff0c;难以完成项目&#xff0c;目前只编写了部分代码加以参考。 test.c #ifndef __TEST_H__ #define SER_PORT 8888 //服务器端口号 #define SER_IP "192.168.&#xff1f;.&#xff1f;" //服务器IP地址 #…

C#上位机与三菱PLC的通信03--MC协议之A-1E报文解析

1、MC协议帧 MC协议可以在串口通信&#xff0c;也可以在以太网通信&#xff0c;有A-1E和Qna-3E两种模式&#xff0c;这两种都是三菱PLC通信协议中比较常用的两种&#xff0c;一般我们使用比较多的是以太网通信&#xff0c;对于FX5U系列/Q系列/Qna系列/L系列的PLC&#xff0c;…

糟糕,接口被刷了,怎么办?

前言 在面试时&#xff0c;经常会被问一个问题&#xff1a;如何防止别人恶意刷接口&#xff1f; 这是一个非常有意思的问题&#xff0c;防范措施挺多的。今天这篇文章专门跟大家一起聊聊&#xff0c;希望对你会有所帮助。 1 防火墙 防火墙是网络安全中最基本的安全设备之一&…

Python eval函数

在Python编程中&#xff0c;eval()函数是一个强大且灵活的内置函数&#xff0c;用于动态执行字符串表达式或代码。尽管eval()函数具有强大的功能&#xff0c;但它也带来了一些潜在的安全风险&#xff0c;因此在使用时需要谨慎。本文将深入探讨eval()函数的用法、语法、示例代码…

AI:129-基于深度学习的极端天气事件预警

🚀点击这里跳转到本专栏,可查阅专栏顶置最新的指南宝典~ 🎉🎊🎉 你的技术旅程将在这里启航! 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带有在本地跑过的关键代码,详细讲解供…

Kibana:如何嵌入 Kibana 仪表板

作者&#xff1a;Carly Richmond 像我这样的前端工程师经常提出的要求是将 Kibana 等来源的现有仪表板嵌入到 JavaScript Web 应用程序中。 这是我必须多次执行的任务&#xff0c;因为我们希望快速部署用户生成的视图或允许用户控制给定的视图。 从我们从精彩的开发者社区收到的…

安装 Windows Server 2019

1.镜像安装 镜像安装:Windows Server 2019 2.安装过程(直接以图的形式呈现) 先选择""我没有产品密钥"",选择桌面体验 选择自定义 设置密码后继续 安装成功

算法——组合数学——二项式定理

杨辉三角是二项式系数的典型应用当 n 较大&#xff0c;且需要取模时&#xff0c;二项式系数有两种计算方法&#xff1a; 一&#xff1a;递推公式&#xff0c;二&#xff1a;逆 方法一&#xff1a;用递推公式计算二项式系数 public class BinomialCoefficient {public static i…

【数据结构】16 二叉树的定义,性质,存储结构(以及先序、后序、中序遍历)

二叉树 一个二叉树是一个有穷的结点集合。 它是由根节点和称为其左子树和右子树的两个不相交的二叉树组成的。 二叉树可具有以下5种形态。 性质 一个二叉树第i层的最大结点数为 2 i − 1 2^{i-1} 2i−1, i ≥ 1 i \geq 1 i≥1 每层最大结点可以对应完美二叉树&#xff08;…

可视化锻炼日记ExerciseDiary

什么是 ExerciseDiary &#xff1f; ExerciseDiary 是带有 GitHub 风格的年度可视化的锻炼日记。 安装 在群晖上以 Docker 方式安装。 在注册表中搜索 exercisediary &#xff0c;选择第一个 aceberg/exercisediary&#xff0c;版本选择 latest。 本文写作时&#xff0c; lat…

互联网时代的文学复兴:中文诗词大数据分析 | 开源日报 No.170

chinese-poetry/chinese-poetry Stars: 45.4k License: MIT 最全的中文诗歌古典文集数据库&#xff0c;包含 5.5 万首唐诗、26 万首宋诗、2.1 万首宋词和其他古典文集。数据来源于互联网。该开源项目旨在通过 JSON 格式分发&#xff0c;方便用户开始自己的项目&#xff0c;并借…

从零开始实现一个三维绘图系统

文章目录 框架布局绘图函数源代码 框架 本文的目标是实现一个下图所示的系统&#xff0c;通过指定 x , y , z x,y,z x,y,z的表达式&#xff0c;以实现三维绘图的目的。这个需求其实此前也实现过&#xff0c;见此文&#xff0c;但其内容比较驳杂&#xff0c;并不利于快速实现&a…

VBA中表示单元格样式A1、R1C1和R[1]C[1]之间的区别

《VBA之Excel应用》&#xff08;版权10178983&#xff09;是非常经典的&#xff0c;是我推出的第七套教程&#xff0c;定位于初级&#xff0c;目前是第一版修订。这套教程从简单的录制宏开始讲解&#xff0c;一直到窗体的搭建&#xff0c;内容丰富&#xff0c;实例众多。大家可…

springboot189基于SpringBoot电商平台的设计与实现

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的 适用于计算机类毕业设计&#xff0c;课程设计参考与学习用途。仅供学习参考&#xff0c; 不得用于商业或者非法用途&#xff0c;否则&#xff0c;一切后果请用户自负。 看运行截图看 第五章 第四章 获取资料方式 **项…

java-类与对象

一、类与对象 二、快速入门 三、类与对象的区别和联系 四、对象在内存中的存在形式

跟着pink老师前端入门教程-day27

三、变量 &#xff08;一&#xff09;变量概述 1、什么是变量 白话&#xff1a;变量就是一个装东西的盒子 通俗&#xff1a;变量是用于存放数据的容器&#xff0c;通过变量名获取数据&#xff0c;甚至数据可以修改 2、变量在内存中的存储 本质&#xff1a;变量是程序在内存…

原型模式-Prototype Pattern

原文地址:https://jaune162.blog/design-pattern/prototype-pattern/ 引言 在Java中如果我们想要拷贝一个对象应该怎么做?第一种方法是使用 getter和setter方法一个字段一个字段设置。或者使用 BeanUtils.copyProperties() 方法。这种方式不仅能实现相同类型之间对象的拷贝,…

解决vitepress首次加载慢(从40秒到1秒的倔强)

前言&#xff1a;在艰难的博客系统升级之路 这篇博客中我有提到vitepress首次加载非常耗时的问题&#xff0c;之前也在网上搜索时发现也有很多人说这个“问题”&#xff0c;但是在折腾了这么一段时间后&#xff0c;发现这也许本身不是vitepress的问题&#xff0c;而是我的启动方…

「递归算法」:两两交换链表中的节点

一、题目 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0c;只能进行节点交换&#xff09;。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4] 输出&#xf…