C++学习笔记——友元、嵌套类、异常

目录

一、友元

一个使用友元的示例代码

输出结果

二、嵌套类

一个使用嵌套类的示例代码

输出结果

三、异常

一个使用异常处理的示例代码

输出结果

四、结论

五、使用它们的注意事项


上一篇文章链接:

C++中的继承和模板是非常强大和灵活的特性,它们可以帮助我们实现代码复用、抽象和泛化等目标。本文将着重介绍私有继承、多重继承和类模板这三个C++中比较重要的特性。

C++学习笔记——私有继承、多重继承、类模板-CSDN博客例如,我们可以使用模板参数来定义成员变量和成员函数,或者使用特化(partial specialization)和偏特化(full specialization)来针对不同的情况实现不同的行为。私有继承是一种比较特殊的继承方式,它在语法上与公有继承和保护继承没有太大区别,但是其继承关系所暴露的接口和成员变量都会被隐藏起来,只有派生类自己可以访问到基类的成员。此外,多重继承也可以用来实现接口继承和实现继承的分离,从而更好地实现面向对象的编程思想。是一个类模板,可以使用不同类型的数据来实例化。https://blog.csdn.net/m0_62338174/article/details/135573044?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22135573044%22%2C%22source%22%3A%22m0_62338174%22%7D 

C++ 是一门功能强大的编程语言,它提供了很多工具来实现各种编程任务。在本文中,我们将介绍 C++ 中的三个重要概念:友元、嵌套类和异常。

一、友元

C++ 中的友元是一种机制,允许一个类或函数访问另一个类的私有成员。当一个类或者函数被声明为另一个类的友元后,它就可以在访问该类的私有成员时绕过访问权限检查,直接访问该类的私有成员。

友元可以是一个类、一个函数或者一个整个命名空间。为了使一个类成为另一个类的友元,需要在其中一个类的声明中使用 friend 关键字来声明该类是另一个类的友元。需要注意的是,友元关系是单向的,即如果 A 类是 B 类的友元,那么 B 类并不一定是 A 类的友元。

使用友元的优点在于它可以提高程序的灵活性和可读性。比如,一个类中的某些私有成员可能只是为了方便内部实现而设置的,但是这些成员对于外部用户来说并没有意义,此时可以通过把需要访问这些私有成员的类或函数声明为友元来提高程序的可用性和可读性。

然而,需要注意的是,过度使用友元会破坏封装性,并降低代码的可维护性。因此,在使用友元时,应该谨慎使用,只在必要的情况下使用友元。

一个使用友元的示例代码

#include <iostream>

class A {
private:
    int x;

public:
    A(int value) : x(value) {}

    friend class B;
};

class B {
public:
    void showMessage(A& a) {
        std::cout << "x = " << a.x << std::endl;
    }
};

int main() {
    A a(10);
    B b;
    b.showMessage(a);
    return 0;
}

在这个示例中,B 类被声明为 A 类的友元,因此 B 类可以访问 A 类的私有成员 xshowMessage() 函数通过引用参数来接收 A 类的对象,并输出了它的私有成员 x 的值。

输出结果

x = 10

友元的使用可以提高程序的灵活性和可读性。但是,需要注意的是过度使用友元会破坏封装性,并降低代码的可维护性。

二、嵌套类

C++ 中的嵌套类是指一个类定义在另一个类的内部,它可以访问外部类的私有成员和保护成员,但外部类不能访问嵌套类的私有成员。嵌套类可以看作是一种逻辑上的组织方式,它可以将与主类相关的功能归纳在一起,提高程序的封装性和可读性。

使用嵌套类的优点在于它可以提高程序的封装性和可读性。比如,一个类中可能包含多个不同的子类,如果将这些子类定义在主类的内部,可以使程序更加整洁和易读。

然而,需要注意的是,过度使用嵌套类会增加代码的复杂度,并降低代码的可维护性。因此,在使用嵌套类时,应该谨慎使用,只在必要的情况下使用嵌套类。

一个使用嵌套类的示例代码

#include <iostream>

class A {
private:
    int x;

public:
    A(int value) : x(value) {}

    class B {
    public:
        void showMessage(A& a) {
            std::cout << "x = " << a.x << std::endl;
        }
    };
};

int main() {
    A a(10);
    A::B b;
    b.showMessage(a);
    return 0;
}

在这个示例中,B 类被嵌套在 A 类的内部,因此 B 类可以访问 A 类的私有成员 xshowMessage() 函数通过引用参数来接收 A 类的对象,并输出了它的私有成员 x 的值。

输出结果

x = 10

嵌套类的使用可以提高程序的封装性和可读性。但是,需要注意的是过度使用嵌套类会增加代码的复杂度,并降低代码的可维护性。

三、异常

C++ 中的异常是指程序运行过程中遇到的错误或异常情况。当程序出现异常时,程序会跳转到异常处理器,并执行一些特定的代码,以处理异常并恢复程序的正常运行。C++ 中的异常处理机制允许程序员在程序出现错误时选择不同的处理方式,从而提高程序的可靠性和鲁棒性。

异常可以分为两类:标准异常和自定义异常。标准异常是 C++ 内置的异常类型,它们定义在 <stdexcept> 头文件中,包括 std::invalid_argumentstd::range_errorstd::logic_error 等。自定义异常是程序员自己定义的异常类型,可以通过继承 std::exception 类来实现。

使用异常处理的优点在于它可以提高程序的健壮性和可读性。当程序出现异常时,程序会跳转到异常处理器,并执行一些特定的代码,以处理异常并恢复程序的正常运行。

然而,需要注意的是,过度使用异常处理会影响程序的性能,并增加代码的复杂度。因此,在使用异常处理时,应该谨慎使用,只在必要的情况下使用异常处理。

一个使用异常处理的示例代码

#include <iostream>
#include <stdexcept>

int divide(int x, int y) {
    if (y == 0) {
        throw std::invalid_argument("Divide by zero.");
    }
    return x / y;
}

int main() {
    int x = 10, y = 0;
    try {
        int z = divide(x, y);
        std::cout << "z = " << z << std::endl;
    } catch (std::exception& e) {
        std::cerr << "Error: " << e.what() << std::endl;
    }
    return 0;
}

在这个示例中,divide() 函数用于计算两个整数的商,如果除数为零,则抛出一个 std::invalid_argument 异常。在 main() 函数中,我们使用 try-catch 块来捕获可能抛出的异常,当程序运行到抛出异常的地方时,程序会跳转到 catch 块并执行其中的代码。

输出结果

Error: Divide by zero.

异常处理的使用可以提高程序的健壮性和可读性。但是,需要注意的是过度使用异常处理会影响程序的性能,并增加代码的复杂度。

四、结论

友元、嵌套类和异常是 C++ 中三个重要的概念,它们可以提高程序的灵活性、封装性和健壮性。但是,需要注意的是过度使用它们会破坏程序的封装性、增加代码的复杂度和影响程序的性能。因此,在编写程序时,应根据实际情况选择适当的编程技术来提高程序的可读性、可维护性和可靠性。

五、使用它们的注意事项

在使用友元、嵌套类和异常时,需要注意以下事项:

  1. 友元关系是单向的,如果将一个类 A 定义为另一个类 B 的友元,则 B 不一定是 A 的友元。
  2. 友元可以提高程序的灵活性和可读性,但过度使用会破坏封装性,降低代码的可维护性。
  3. 嵌套类可以将与主类相关的功能归纳在一起,提高程序的封装性和可读性,但过度使用会增加代码的复杂度,降低代码的可维护性。
  4. 异常处理机制可以提高程序的健壮性和可读性,但过度使用会影响程序的性能,增加代码的复杂度。在编写程序时,应该根据实际情况选择适当的处理方式。
  5. 在使用异常处理时,应该明确什么情况下应该抛出异常,什么情况下应该返回错误码或者其他特定值。抛出异常应该是一种非常规的处理方式,只在必要的情况下使用。
  6. 在使用嵌套类时,应该考虑将哪些功能归纳在一起,以及哪些功能应该作为一个独立的类来实现。嵌套类的使用应该有助于提高程序的结构性和可读性。
  7. 在使用友元时,应该仔细考虑哪些类或者函数需要访问另一个类的私有成员,只在必要的情况下使用。同时,应该尽量避免破坏封装性,保证程序的可维护性和可靠性。

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

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

相关文章

C++学习笔记——标准模板库

目录 一、简介 二、STL概述 2.1STL是什么&#xff1f; 2.2STL的优势 三、容器&#xff08;Containers&#xff09; 3.1序列式容器&#xff08;Sequence Containers&#xff09; 3.2关联式容器&#xff08;Associative Containers&#xff09; 3.3容器适配器&#xff08;…

轻松批量重命名不同路径文件:从1到N的单独编号指南

在处理大量文件时&#xff0c;有时要批量重命名这些文件。整理、归档或是进行其他类型的处理。但不同的文件可能位于不同的路径下&#xff0c;增加了批量重命名的复杂性。下面来看云炫文件管理器如何批量重命名不同路径下的文件&#xff0c;从1到N单独编号的方法。 不同路径文件…

考研经验总结——目录

文章目录 一、写作顺序二、个人情况说明三、读评论四、一些小牢骚五、一些注意事项&#xff08;持续更新&#xff09; 一、写作顺序 我将准备从三个阶段开始介绍吧 考研前考研中考研后&#xff08;也就是现在我的这种情况&#xff09; 考研前我会分为&#xff1a;数学、专业…

三轴加速度计LIS2DW12开发(3)----检测活动和静止状态

e2studio开发三轴加速度计LIS2DW12.3--检测活动和静止状态 概述视频教学样品申请源码下载新建工程工程模板保存工程路径芯片配置工程模板选择时钟设置UART配置UART属性配置设置e2studio堆栈e2studio的重定向printf设置R_SCI_UART_Open()函数原型回调函数user_uart_callback ()…

vue3+vite开发生产环境区分

.env.development VITE_APP_TITLE本地.env.production VITE_APP_TITLE生产-ts文件中应用 console.log(import.meta.env.VITE_APP_TITLE)在html中应用&#xff0c;需要安装 html 模板插件 pnpm add vite-plugin-html -Dvite.config.ts中 import { createHtmlPlugin } from v…

python|切片

切片的语法格式 object[start_index:end_index:step] &#xff08;1&#xff09;step步长&#xff1a;有正负&#xff0c;正表示正着走&#xff0c;负表示负着走&#xff0c;步长的绝对值代表一步走的距离。 &#xff08;其中&#xff0c;在深度学习中卷积也有步长的说法&…

从比特币、以太坊生态,到AI与新公链复兴,谁将接棒2024年的主流叙事?

2023年10月份至今&#xff0c;现货比特币ETF一直都是促使市场反弹的核心叙事之一&#xff0c;如今靴子终于落地&#xff0c;那在ETF预期尘埃落定的大背景下&#xff0c;接下来的加密市场有哪些赛道值得关注&#xff1f; 泛比特币生态 2023年比特币生态浪潮中&#xff0c;OKX等赢…

什么是数通技术?以太网交换机在数通技术中的精要

什么是数通技术&#xff1f; 数通技术是指数字通信技术&#xff0c;它涵盖了数字信号处理、数据传输、网络通信等领域。通信工程师在数通技术中负责设计、建设和维护数字通信系统&#xff0c;以实现可靠、高效的信息传输。这涉及到数字信号的编解码、调制解调、数据压缩、网络…

【论文解读】SiamMAE:用于从视频中学习视觉对应关系的 MAE 简单扩展

来源&#xff1a;投稿 作者&#xff1a;橡皮 编辑&#xff1a;学姐 论文链接&#xff1a;https://siam-mae-video.github.io/resources/paper.pdf 项目主页&#xff1a;https://siam-mae-video.github.io/ 1.背景 时间是视觉学习背景下的一个特殊维度&#xff0c;它提供了一…

QT上位机开发(加密和解密)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 加密和解密是我们在软件开发中经常遇到的一种情形。最早的时候&#xff0c;加密是用在军事上面。现在由于各个行业、各个公司之间的竞争也非常激烈…

Kafka的安装、管理和配置

Kafka的安装、管理和配置 1.Kafka安装 官网: https://kafka.apache.org/downloads 下载安装包,我这里下载的是https://archive.apache.org/dist/kafka/3.3.1/kafka_2.13-3.3.1.tgz Kafka是Java生态圈下的一员&#xff0c;用Scala编写&#xff0c;运行在Java虚拟机上&#xf…

不会 python 语言没关系,GPT 会呀

在日常办公或者是编程过程中&#xff0c;经常要处理一些琐碎的任务。就拿编程来说&#xff0c;假如你现在收到一个任务&#xff0c;要提取源代码中所有的字符串&#xff0c;进行国际化。 一般来说&#xff0c;很多软件开发工具提供了国际化方案&#xff0c;比如 QT&#xff0c;…

x-cmd pkg | fx - Warp 支持的 JSON 查看和处理工具

目录 简介首次用户功能特点类似工具与竞品进一步探索 简介 fx 是一款由专为 JSON 定制的双用途命令行工具&#xff0c;提供基于终端的 JSON 查看器和 JSON 处理实用程序。虽然 JSON 查看器是用 Go 编写的&#xff0c;并且无需外部依赖即可运行&#xff0c;但 JSON 处理工具是用…

openGauss学习笔记-196 openGauss 数据库运维-常见故障定位案例-强制结束指定的问题会话

文章目录 openGauss学习笔记-196 openGauss 数据库运维-常见故障定位案例-强制结束指定的问题会话196.1 强制结束指定的问题会话196.1.1 问题现象196.1.2 处理办法 openGauss学习笔记-196 openGauss 数据库运维-常见故障定位案例-强制结束指定的问题会话 196.1 强制结束指定的…

实验室服务器升级

cuda、python、pytorch 版本兼容查看顺序及网站 任务&#xff1a; 在一个有GPU的电脑上安装pytorch时选择合适版本。 简述&#xff1a; 安装 pytorch 时&#xff0c;若要使用 GPU&#xff0c;需要考虑与 CUDA&#xff0c;python 的版本兼容情况。推荐考虑顺序&#xff1a;CUD…

NUS CS1101S:SICP JavaScript 描述:四、元语言抽象

原文&#xff1a;4 Metalinguistic Abstraction 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 …魔法就在于文字——Abracadabra&#xff0c;开门&#xff0c;以及其他——但一个故事中的魔法词在另一个故事中并不神奇。真正的魔法是理解哪些词起作用&#xff0c;何时…

Jenkins创建maven项目

Jenkins创建maven项目 环境准备 如果在项目没有看到maven&#xff0c;需要下载插件 本机需要有maven&#xff0c;并且maven配置过国内镜像&#xff0c;否则很大概率插件下不下来&#xff0c;如果有docker之前没有配置过需要进入docker手动配置。 需要在全局中配置maven的set…

Kubernetes (十一) 存储——Secret配置管理

一. 简介 从文件创建 echo -n admin > ./username.txt echo -n westos > ./password.txt kubectl create secret generic db-user…

力扣(leetcode)第606题根据二叉树创建字符串(Python)

606.根据二叉树创建字符串 题目链接&#xff1a;606.根据二叉树创建字符串 给你二叉树的根节点 root &#xff0c;请你采用前序遍历的方式&#xff0c;将二叉树转化为一个由括号和整数组成的字符串&#xff0c;返回构造出的字符串。 空节点使用一对空括号对 “()” 表示&…

【大数据】Flink 详解(九):SQL 篇 Ⅱ

本系列包含&#xff1a; 【大数据】Flink 详解&#xff08;一&#xff09;&#xff1a;基础篇【大数据】Flink 详解&#xff08;二&#xff09;&#xff1a;核心篇 Ⅰ【大数据】Flink 详解&#xff08;三&#xff09;&#xff1a;核心篇 Ⅱ【大数据】Flink 详解&#xff08;四…