【C++】-类和对象(友元!!内部类!!匿名对象!详解)

news2024/11/20 4:22:05

类和对象⑤

  • 友元
  • 内部类
  • 匿名对象

在之前的类和对象①、②、③、④篇中,详细讲解了类和对象的基本知识,本章为最终章,继续为大家介绍类和对象。在这里插入图片描述

友元

我们已知的,在C++中,有一种私有访问修饰符,用于限制类的成员只能在类的内部访问。私有成员对外部是不可见的,其他类或函数无法直接访问私有成员。但是我们已经做过重载操作符这个动作,某些操作符可能会需要访问类的私有成员,那么private限制符就阻挡了我们的脚步。

这个时候就可以用到友元来解决这一问题。友元关系是C++中一个神秘而又强大的特性。它就像是一扇隐藏的秘密门,让我们能够进入类的私有领域。

友元可以分为友元函数友元类

友元函数:
在C++中,友元函数是一个被声明为类的友元的非成员函数。像它的名字一样,这意味着友元函数可以直接访问类的私有成员和保护成员,而不需要通过类的对象或成员函数来访问。在这里插入图片描述

友元函数的声明通常放在类的定义中,并使用关键字friend进行标记。这将告诉编译器该函数是类的友元函数,可以访问类的私有成员。也可以说它是定义在类外部的普通函数,不属于任何类,但需要在
类的内部声明。

以下是友元函数的基本语法:

class MyClass {
private:
    int privateVariable;

public:
    friend void friendFunction();
};

在上述示例中,friendFunction()被声明为MyClass的友元函数

所以对友元函数做一个总结:

  • 友元函数可访问类的私有和保护成员,但不是类的成员函数
  • 友元函数不能用const修饰
  • 友元函数可以在类定义的任何地方声明,不受类访问限定符限制
  • 一个函数可以是多个类的友元函数
  • 友元函数的调用与普通函数的调用原理相同

总而言之,将函数声明为类的友元函数的情况通常涉及到需要访问类的私有成员的操作,如重载操作符或优化性能。友元函数的存在打破了类的封装性,因此应该谨慎使用,并仅在确实需要访问私有成员时使用。

友元类:

友元类是也是C++中的一个特性,它允许一个类的所有成员函数或另一个类访问另一个类的私有成员和保护成员。通过将一个类声明为另一个类的友元类,可以打破类的封装性,并允许对私有成员的直接访问。

要将一个类声明为另一个类的友元类,也可以在被访问的类的定义中使用friend关键字来声明友元类。

以下是友元类的基本语法:

class MyClass {
private:
    int privateVariable;

public:
    friend class FriendClass;
};

在上述示例中,FriendClass被声明为MyClass的友元类。

通过友元类,友元类中的所有成员函数都可以直接访问被访问类的私有成员和保护成员。:

class MyClass {
private:
    int privateVariable;

public:
    friend class FriendClass;
};

class FriendClass {
public:
    void accessPrivateMember(const MyClass& obj) {
        int value = obj.privateVariable; // 可以访问私有成员
    }
};

在上面的例子中,FriendClass是MyClass的友元类。在FriendClass的成员函数accessPrivateMember()中,可以直接访问MyClass的私有成员privateVariable。

在这里插入图片描述
需要注意的是,友元关系不具有传递性。如果类A是类B的友元类,类B不一定是类A的友元类。这意味着,虽然类A可以访问类B的私有成员,但类B不能直接访问类A的私有成员。

使用友元类需要谨慎考虑,因为它会打破类的封装性。友元类应该仅在确实需要对另一个类的私有成员进行直接访问时使用。

内部类

内部类是C++的另一个特性,它允许在一个类的内部定义另一个类。内部类可以访问包含它的外部类的所有成员,包括私有成员和保护成员。使用内部类可以将相关的类组合在一起,并提高代码的可读性和可维护性。

看如下代码:

class Class1 {
private:
    int privateVariable;

public:
    class InnerClass {
    public:
        void accessOuterMember(OuterClass& obj) {
            int value = obj.privateVariable; // 可以访问外部类的私有成员
        }
    };
};

在上述示例中,在Class1内又定义了一个名为InnerClass的内部类。在InnerClass的成员函数accessOuterMember()中,可以直接访问OuterClass的私有成员privateVariable。

需要注意的是,内部类的名称对外部世界是不可见的。如果你想从外部访问内部类,你必须使用外部类的名称来限定它。

使用内部类可以将相关的类组合在一起,并提高代码的可读性和可维护性。内部类可以访问外部类的私有成员和保护成员,从而进一步增强了封装性。

匿名对象

在C++中,匿名对象是指没有命名的临时对象。它们通常在函数调用中使用,可以方便地创建一个临时对象并立即使用它,而不需要在代码中为它定义一个变量名。匿名对象可以作为函数的参数或返回值。

#include <iostream>

class MyClass {
public:
    void print() {
        std::cout << "Hello, World!\n";
    }
};

int main() {
    // 创建一个匿名对象,并立即调用它的成员函数
    MyClass().print();

    return 0;
}

在上面的代码中,我们创建了一个MyClass的匿名对象,并立即调用它的成员函数print()。由于这个对象没有被命名,因此我们不能在后面的代码中再次引用它。

在某些情况下,匿名对象可以提高代码的可读性和简洁性。例如,在创建临时对象时,我们可以使用匿名对象来避免创建不必要的变量。

需要注意的是,匿名对象的生命周期很短,只能在表达式中使用。当包含匿名对象的表达式结束时,匿名对象就会被销毁。

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

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

相关文章

this.setState的注意事项

目录 1、this.setState的注意事项 2、是什么造成了this.setState()的不同步&#xff1f; 3、 那this.setState()什么时候同步&#xff0c;什么时候不同步&#xff1f; 3.1 经过React包装的onClick点击事件&#xff08;&#xff09; 3.2 没经过React包装的 原生点击事件 …

stm32学习笔记:USART串口通信

1、串口通信协议&#xff08;简介软硬件规则&#xff09; 全双工&#xff1a;打电话。半双工&#xff1a;对讲机。单工&#xff1a;广播 时钟&#xff1a;I2C和SPI有单独的时钟线&#xff0c;所以它们是同步的&#xff0c;接收方可以在时钟信号的指引下进行采样。串口、CAN和…

18 串口通讯

文章目录 18.0 前言18.1 串口通讯协议简介18.1.1 物理层 18.2 RT1052 的 LPUART 简介18.3 UART 功能框图18.3.1 中断控制 18.4 UART 初始化结构体详解18.4.1 baudRate_Bps18.4.2 parityMode18.4.3 dataBitsCount18.4.4 isMsb18.4.5 stopBitCount18.4.6 txFifoWatermark与rxFifo…

计算机体系结构基础复习

1. 计算机系统可划分为哪几个层次,各层次之间的界面是什么? 你认为这样划分层次的意义何在? 答&#xff1a; 计算机系统可划分为四个层次&#xff0c;分别是&#xff1a;应用程序、 操作系统、 硬件系统、 晶体管四个大的层次。 注意把这四个层次联系起来的三个界面。各层次…

WIndows系统重装、备份与恢复实操问题笔记

一 windows重装 1.1 基本步骤 下载大白菜根据官网使用教程制作启动u盘从MSDN或者微软官网下载Windows镜像根据查询的快捷键进入BIOS系统&#xff0c;设置U盘为第一启动 重装 1.2 Windows 11 激活 微软其实在2023年9月20日的公告中宣布停掉免费升级&#xff0c;数字激活工具…

使用pygame实现简单的烟花效果

import pygame import sys import random import math# 初始化 Pygame pygame.init()# 设置窗口大小 width, height 800, 600 screen pygame.display.set_mode((width, height)) pygame.display.set_caption("Fireworks Explosion")# 定义颜色 black (0, 0, 0) wh…

YOLOv7涨点改进:多层次特征融合(SDI),小目标涨点明显,| UNet v2,比UNet显存占用更少、参数更少

💡💡💡本文全网独家改进:多层次特征融合(SDI),能够显著提升不同尺度和小目标的识别率 💡💡💡在YOLOv7中如何使用 1)iAFF加入Neck替代Concat; 收录: YOLOv7高阶自研专栏介绍: http://t.csdnimg.cn/tYI0c ✨✨✨前沿最新计算机顶会复现 🚀🚀🚀YOL…

Linux远程登陆协议ssh

目录 一、SSH服务 1. ssh基础 2. 原理 3. 服务端配置 3.1 常用配置项 3.2 具体操作 3.2.1 修改默认端口号 3.2.2 禁止root用户登录 3.2.3 白名单列表 3.2.4 黑名单列表 3.2.5 使用秘钥对及免交互验证登录 3.2.6 免交互式登录 一、SSH服务 1. ssh基础 SSH&…

Microsoft Excel 直方图

Microsoft Excel 直方图 1. 数据示例2. 打开 EXCEL3. settings4. 单击直方图柱&#xff0c;右键“添加数据标签”References 1. 数据示例 2. 打开 EXCEL 数据 -> 数据分析 -> 直方图 3. settings 输入区域样本值、接受区域分类间距&#xff0c;输出选项选择“新工作表组…

玩转Mysql 八 (MySQ优化入门篇)

一路走来&#xff0c;所有遇到的人&#xff0c;帮助过我的、伤害过我的都是朋友&#xff0c;没有一个是敌人。如有侵权&#xff0c;请留言&#xff0c;我及时删除&#xff01; 前言&#xff1a; 一个高性能&#xff0c;稳定的数据库集群并不是指的某一特性优化&#xff0c;就…

3 - AOP

1. 快速入门 1.1 基本说明 AOP(aspect oriented programming) &#xff0c;面向切面编程 切面类中声明通知方法&#xff1a; 前置通知&#xff1a;Before返回通知&#xff1a;AfterReturning异常通知&#xff1a;AfterThrowing后置通知&#xff1a;After环绕通知&#xff1…

并发List源码剖析

并发包中的并发List只有CopyOnWriteArrayList。 CopyOnWriteArrayList是一个线程安全的ArrayList,对其进行的修改操作都是在底层的一个复制的数组(快照)上进行的&#xff0c;也就是使用了写时复制策略。 在CopyOnWriteArrayList的类图中&#xff0c;每个CopyOnWriteArrayList对…

(学习日记)2024.01.05:一份关于自行车定位的调研

写在前面&#xff1a; 由于时间的不足与学习的碎片化&#xff0c;写博客变得有些奢侈。 但是对于记录学习&#xff08;忘了以后能快速复习&#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位&#xff0c;以时间为顺序&#xff0c;仅仅将博客当做一个知识学习的目录&a…

电流检测方法

电路检测电路常用于&#xff1a;高压短路保护、电机控制、DC/DC换流器、系统功耗管理、二次电池的电流管理、蓄电池管理等电流检测等场景。 对于大部分应用&#xff0c;都是通过感测电阻两端的压降测量电流。 一般使用电流通过时的压降为数十mV&#xff5e;数百mV的电阻值&…

BLDC 电机和 PMSM 的结构区别

BLDC 电机和 PMSM 的结构类似&#xff0c;其永磁体均置于转子&#xff0c;并被定义为同步电机。在同步电机中&#xff0c;转子与定子磁场同步&#xff0c;即转子的旋转速度与定子磁场相同。它们的主要区别在于其反电动势&#xff08;反 EMF&#xff09;的形状。电机在旋转时充当…

NPS配置https访问web管理页面

因为NPS默认也支持http的访问&#xff0c;所以在部署完后就一直没在意这个事情。 因为服务器是暴露在公网内的&#xff0c;所以还是要安全一点才行。不然一旦远控的机器被破解了就很危险了 一、使用nginx反向代理访问 1、首先在nps的配置文件里关闭使用https选项&#xff0c;…

midjourney教程【--niji 5】

博客底部扫码加微信&#xff0c;免费领mj Niji Model Version 5还可以使用不同的美学使用--style选项&#xff0c;以实现独特的外观。试试 --style cute, --style scenic, --style original , or --style expressive mj&#xff0c;a boy sitting on the ground looking soci…

Logstash:迁移数据到 Elasticsearch

在生产环境中&#xff0c;不使用 Apache Kafka 等流平台进行数据迁移并不是一个好的做法。 在这篇文章中&#xff0c;我们将详细探讨 Apache Kafka 和 Logstash 的关系。 但首先让我们简单了解一下 Apache Kafka 的含义。 Apache Kafka 是分布式流平台&#xff0c;擅长实时数据…

计算机找不到vcomp140.dll怎样修复?马上教会你修复dll问题

在计算机系统运行过程中&#xff0c;遭遇“vcomp140.dll丢失”的场景并不少见&#xff0c;这一问题的出现往往伴随着软件无法正常启动、运行时错误提示或者系统性能下降等现象。具体场景可能包括但不限于&#xff1a;用户在尝试打开某个依赖于Visual C Redistributable库的应用…

有趣的事,讲给有趣的人听

哈哈哈&#xff0c;今天不写技术了&#xff0c;今天分享一下生活&#xff0c;技术我们什么时候都可以学&#xff0c;但是生活更值得我们现在就去更好的体验&#xff01; 两年多的涤生大数据&#xff0c;认识了形形色色的小伙伴&#xff0c;陆续沟通下来6000多人&#xff0c;彼时…