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

news/2024/2/24 7:32:53/文章来源:https://blog.csdn.net/m0_62338174/article/details/135573148

目录

一、友元

一个使用友元的示例代码

输出结果

二、嵌套类

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

输出结果

三、异常

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

输出结果

四、结论

五、使用它们的注意事项


上一篇文章链接:

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. 在使用友元时,应该仔细考虑哪些类或者函数需要访问另一个类的私有成员,只在必要的情况下使用。同时,应该尽量避免破坏封装性,保证程序的可维护性和可靠性。

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

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

相关文章

03.用于LLMs不同的任务-transformer 架构

大多数现代LLMs都依赖于 transformer 架构,这是 2017 年论文 Attention Is All You Need 中介绍的深度神经网络架构。要理解LLMs,我们必须简要回顾一下最初的转换器,它最初是为机器翻译而开发的,将英语文本翻译成德语和法语。变压器架构的简化版本如图 1.4 所示。 图 1.4 …

Redis:原理速成+项目实战——Redis实战9(秒杀优化)

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位大四、研0学生&#xff0c;正在努力准备大四暑假的实习 &#x1f30c;上期文章&#xff1a;Redis&#xff1a;原理速成项目实战——Redis实战8&#xff08;基于Redis的分布式锁及优化&#xff09; &#x1f4da;订阅专栏&…

springboot第49集:【思维导图】多线程,常用类与基础API,集合框架,泛型,数据结构源码...

多线程创建方式一&#xff1a;继承Thread类多线程创建方式二&#xff1a;实现Runnable接口jdk5.0新增两种创建多线程的方式 image.png image.png image.png image.png image.png new Thread(new Runnable() {public void run() {for (int i 1; i < 100; i) {if (i % 2 0) …

20240116使用Firefly的AIO-3399J的预编译的Android10固件确认RT5640声卡信息

20240116使用Firefly的AIO-3399J的预编译的Android10固件确认RT5640声卡信息 2024/1/16 17:55 百度&#xff1a;RK3399 ALC5640 RK3399 RT5640 BING&#xff1a;RK3399 ALC5640 LINE-IN接麦克风不会有声音的。 耳机只有右边有声音&#xff0c;但是偏小&#xff0c;可以通过音量…

在线SM2加签工具

在线SM2加签工具 - BTool在线工具软件&#xff0c;为开发者提供方便。本工具采用了国密局推荐的SM2签名算法&#xff0c;SM2签名算法是一种基于椭圆曲线密码体系的数字签名算法&#xff0c;是中国国家密码管理局制定的国密标准之一。SM2签名算法的安全性基于椭圆曲线离散对数问…

Elasticsearch Windows部署-ELK技术栈

1、下载Elasticsearch、kibana、logstash 本文不介绍ELK相关原理知识&#xff0c;只记录部署操作过程 下载地址Past Releases of Elastic Stack Software | Elastic 选择同一版本&#xff0c;这里选择是当前最新版本8.11.3 解压放在同目录下&#xff0c;方便后续操作与使用 …

【OpenAI】自定义GPTs应用(GPT助手应用)及外部API接口请求

11月10日&#xff0c;OpenAI正式宣布向所有ChatGPT Plus用户开放GPTs功能 简而言之&#xff1a;GPT应用市场(简称GPTs, 全称GPT Store) Ps&#xff1a; 上图为首次进入时的页面&#xff0c;第一部分是自己创建的GPTs应用&#xff0c;下面是公开可以使用的GPTs应用 一、创建GPTs…

HTML5+CSS3+JS小实例:音频可视化

实例:音频可视化 技术栈:HTML+CSS+JS 效果: 源码: 【HTML】 <!DOCTYPE html> <html lang="zh-CN"> <head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><m…

jmeter--4.参数化的方式

目录 1. 用户定义的变量 2. 用户参数 3. 函数助手 3.1 time获取当前时间 3.2 Random随机数 3.3 随机字符串函数 3.4 字符串变更为大写 4. CSV数据文件设置 5. 接口关联--正则和json等提取 1. 用户定义的变量 线程组->添加->配置元件->用户定义的变量 引用方…

HCIA——12题目-1章选择

学习目标&#xff1a; 计算机网络 1.掌握计算机网络的基本概念、基本原理和基本方法。 2.掌握计算机网络的体系结构和典型网络协议&#xff0c;了解典型网络设备的组成和特点&#xff0c;理解典型网络设备的工作原理。 3.能够运用计算机网络的基本概念、基本原理和基本方法进行…

【Linux】进程信号,相关函数的简单实用

文章目录 一、讨论范围二、信号的结构1.信号的本质2.预备知识2.1 如何发送信号2.2 如何查看后台程序 三、改变信号默认触发方式的两个函数1.signal2.sigaction 四、信号集操作函数和相关指令0.sigprocmask1.sigemptyset2.sigaddset3.sigdelset4.sigfillset 总结 一、讨论范围 编…

Android的setContentView流程

一.Activity里面的mWindow是啥 在ActivityThread的performLaunchActivity方法里面&#xff1a; private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {ActivityInfo aInfo r.activityInfo;if (r.packageInfo null) {r.packageInfo getP…

重学Java 7 数组Arr.1

我欲与君相知&#xff0c;长命无绝衰 ——24.1.16 一、数组的定义 1.概述&#xff1a;数组是一个容器&#xff0c;数组本身属于引用数据类型 2.作用&#xff1a;一次存储多个数据 3.特点&#xff1a; ①既可以存储基本类型的数据&#xff0c;也可以存储引用类型的数据 ②定长&a…

ACL【新华三与华为的区别】

【解释】acl简单点解释就是&#xff0c;一套根据需求而设置的规则 【背景】 192.168.1.0/24 网段不允许访问 192.168.2.0/24 网段&#xff0c;要求使用基本 ACL 实现20_1 可以访问 20_6 的 TELNET 服务&#xff0c;但不能访问 FTP 服务 【操作步骤】 {易混点 }&#xff1a;1. …

06--视图、索引、事务、权限

1、视图(view) 1.1 什么是视图 视图是一种根据查询&#xff08;也就是SELECT表达式&#xff09;定义的数据库对象&#xff0c;用于获取想要看到和使用的局部数据 视图有时也被成为“虚拟表”。 视图可以被用来从常规表&#xff08;称为“基表”&#xff09;或其他视图中查询…

k8s 存储卷和pvc,pv

存储卷---数据卷 容器内的目录和宿主机的目录进行挂载。 容器在系统上的生命周期是短暂的&#xff0c;deletek8s用控制器创建的pod&#xff0c;delete相当于重启&#xff0c;容器的状态也会回复到初始状态。 一旦回到初始状态&#xff0c;所有的后天编辑的文件的都会消失。 …

PySide6/PyQt6如何设置全局热键,全局热键!

文章目录 📖 介绍 📖🏡 环境 🏡📒 实现方法 📒⚓️ 相关链接 ⚓️📖 介绍 📖 我们在使用PySide6/PyQt6设置热键的时候一般都是使用QShortcut,、QKeySequence两个类来实现,但是这样写的快键键并不是全局快捷键,需要用户激活软件窗口才能实现快捷键对应的功能,…

【面试合集】说说微信小程序的发布流程?

面试官&#xff1a;说说微信小程序的发布流程&#xff1f; 一、背景 在中大型的公司里&#xff0c;人员的分工非常仔细&#xff0c;一般会有不同岗位角色的员工同时参与同一个小程序项目。为此&#xff0c;小程序平台设计了不同的权限管理使得项目管理者可以更加高效管理整个团…

数据结构【树+二叉树】

目录 线性表和非线性表 树的概念 树的存储表示 二叉树的概念 特殊二叉树 满二叉树 完全二叉树 二叉树的性质 二叉树的存储结构 顺序存储 链式存储 本篇我们开始进入数据结构中【树】的学习。 线性表和非线性表 逻辑结构&#xff1a;人想象出来的物理结构&#xf…