类和对象【六】友元和内部类

2024-05-26 10:44
文章标签 对象 内部 友元

本文主要是介绍类和对象【六】友元和内部类,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 友元
    • 友元的作用
    • 友元的缺点
    • 友元函数
      • 语法:
      • 特点:
    • 友元类
      • 语法:
      • 特点:
  • 内部类
    • 概念
    • 特点

友元

友元的作用

友元提供了一种打破封装的方式,有时提供了便利。

友元的主要作用就是打破封装

即可以让一个类的友元函数/友元类可以直接访问和修改这个类的私有(private)和被保护(protected)成员


友元的缺点

  1. 安全性降低:友元可以不受限制地访问类的所有成员,这可能导致数据的不安全暴露。
  2. 封装性受损:尽管友元不是类的成员,但它的存在使得类的封装性受到破坏,因为非友元函数或类无法直接访问某类中的私有成员和被保护成员。

在实际编程中,应谨慎使用友元机制,避免因为封装性的破坏安全性的降低而导致程序的不稳定和难以维护。

友元应当只在没有其他更好的解决方案时才被考虑使用。


友元函数

语法:

在类中的任何一个访问限定符下增加一句声明:
friend(关键字) 全局的函数声明

即可让这个全局函数成为该类的友元函数

在这里插入图片描述
在这里插入图片描述

特点:

  1. 友元函数可访问类的私有和保护成员,但不是类的成员函数

  2. 友元函数不能用const修饰,因为const修饰函数的时候修饰的是this指针,只有类的成员函数才有this指针

  3. 友元函数的调用与普通函数的调用原理相同

  4. 一个函数可以是多个类的友元函数


友元类

如果类B是类A的友元类,那就可以在类B的作用域中【类B的成员函数的作用域也是类B的作用域】直接访问类A的成员

在这里插入图片描述
在这里插入图片描述


语法:

在类中的任何一个访问限定符下增加一句声明:
friend(关键字) 友元类的声明


特点:

  1. 友元关系是单向的,不具有交换性
    比如上面的事例中类B是类A的友元类,B就可以访问A中的私有和保护成员,但是A却不能访问B中的私有和保护成员,因为B并没有声明A是B的友元类【突然有点可悲是怎么回事?即A把B当做朋友,为B掏心掏肺,但B可能认为A什么都不是】
    在这里插入图片描述

  2. 友元关系不能继承【这个可以形象的理解为爸爸的朋友并不一定是儿子的朋友】

  3. 友元关系不能传递【我朋友的朋友也不一定是我的朋友】
    例:类C是类B的友元类,类B是类A的友元类,但类C不是类A的友元类


内部类

概念

如果一个类定义在另一个类的内部,这个内部类就叫做内部类。
内部类是一个独立的类,它不属于外部类,更不能通过外部类的对象去访问内部类的成员。

类比一下:
普通类是在命名空间域/全局域中定义的,但是普通类还是有一个自己的独立的类域,在类域之外的统一为外部,外部不可直接访问类中的私有和保护成员

内部类就是在另一个类的作用域中的定义的,所以内部类的类域之外的也统一是外部


特点

  1. 内部类是定义在一个类的类域里面的,而访问类域里面的东西必须指定类域【和命名空间类似】
    所以要在外部类之外使用内部类时,要用外部类+::先找到内部类
    在这里插入图片描述

  2. 内部类在外部类的类域里,在类域里的东西都受访问限定符的限制,内部类也不例外
    在这里插入图片描述

  3. 内部类是外部类的友元类,内部类可以通过外部类的对象参数来访问外部类中的所有成员【包括私有和被保护成员】,但是外部类不是内部类的友元
    在这里插入图片描述

  4. 内部类可以直接访问外部类中的static成员不需要外部类的对象/类名

这篇关于类和对象【六】友元和内部类的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1004247

相关文章

Spring常见错误之Web嵌套对象校验失效解决办法

《Spring常见错误之Web嵌套对象校验失效解决办法》:本文主要介绍Spring常见错误之Web嵌套对象校验失效解决的相关资料,通过在Phone对象上添加@Valid注解,问题得以解决,需要的朋... 目录问题复现案例解析问题修正总结  问题复现当开发一个学籍管理系统时,我们会提供了一个 API 接口去

Java如何通过反射机制获取数据类对象的属性及方法

《Java如何通过反射机制获取数据类对象的属性及方法》文章介绍了如何使用Java反射机制获取类对象的所有属性及其对应的get、set方法,以及如何通过反射机制实现类对象的实例化,感兴趣的朋友跟随小编一... 目录一、通过反射机制获取类对象的所有属性以及相应的get、set方法1.遍历类对象的所有属性2.获取

java中VO PO DTO POJO BO DO对象的应用场景及使用方式

《java中VOPODTOPOJOBODO对象的应用场景及使用方式》文章介绍了Java开发中常用的几种对象类型及其应用场景,包括VO、PO、DTO、POJO、BO和DO等,并通过示例说明了它... 目录Java中VO PO DTO POJO BO DO对象的应用VO (View Object) - 视图对象

vue如何监听对象或者数组某个属性的变化详解

《vue如何监听对象或者数组某个属性的变化详解》这篇文章主要给大家介绍了关于vue如何监听对象或者数组某个属性的变化,在Vue.js中可以通过watch监听属性变化并动态修改其他属性的值,watch通... 目录前言用watch监听深度监听使用计算属性watch和计算属性的区别在vue 3中使用watchE

Java将时间戳转换为Date对象的方法小结

《Java将时间戳转换为Date对象的方法小结》在Java编程中,处理日期和时间是一个常见需求,特别是在处理网络通信或者数据库操作时,本文主要为大家整理了Java中将时间戳转换为Date对象的方法... 目录1. 理解时间戳2. Date 类的构造函数3. 转换示例4. 处理可能的异常5. 考虑时区问题6.

Java第二阶段---09类和对象---第三节 构造方法

第三节 构造方法 1.概念 构造方法是一种特殊的方法,主要用于创建对象以及完成对象的属性初始化操作。构造方法不能被对象调用。 2.语法 //[]中内容可有可无 访问修饰符 类名([参数列表]){ } 3.示例 public class Car {     //车特征(属性)     public String name;//车名   可以直接拿来用 说明它有初始值     pu

STM32内部闪存FLASH(内部ROM)、IAP

1 FLASH简介  1 利用程序存储器的剩余空间来保存掉电不丢失的用户数据 2 通过在程序中编程(IAP)实现程序的自我更新 (OTA) 3在线编程(ICP把整个程序都更新掉) 1 系统的Bootloader写死了,只能用串口下载到指定的位置,启动方式也不方便需要配置BOOT引脚触发启动  4 IAP(自己写的Bootloader,实现程序升级) 1 比如蓝牙转串口,

FreeRTOS内部机制学习03(事件组内部机制)

文章目录 事件组使用的场景事件组的核心以及Set事件API做的事情事件组的特殊之处事件组为什么不关闭中断xEventGroupSetBitsFromISR内部是怎么做的? 事件组使用的场景 学校组织秋游,组长在等待: 张三:我到了 李四:我到了 王五:我到了 组长说:好,大家都到齐了,出发! 秋游回来第二天就要提交一篇心得报告,组长在焦急等待:张三、李四、王五谁先写好就交谁的

java线程深度解析(一)——java new 接口?匿名内部类给你答案

http://blog.csdn.net/daybreak1209/article/details/51305477 一、内部类 1、内部类初识 一般,一个类里主要包含类的方法和属性,但在Java中还提出在类中继续定义类(内部类)的概念。 内部类的定义:类的内部定义类 先来看一个实例 [html]  view plain copy pu

HTML5自定义属性对象Dataset

原文转自HTML5自定义属性对象Dataset简介 一、html5 自定义属性介绍 之前翻译的“你必须知道的28个HTML5特征、窍门和技术”一文中对于HTML5中自定义合法属性data-已经做过些介绍,就是在HTML5中我们可以使用data-前缀设置我们需要的自定义属性,来进行一些数据的存放,例如我们要在一个文字按钮上存放相对应的id: <a href="javascript:" d