C++ Primer Chapter 7 Classes

C++ Primer Chapter 7 Classes

用于创建无线网

netsh wlan set hostednetwork mode=allow ssid=NetName key=password

2024/05/30
类的基本思想是数据抽象 (data abstraction)封装(encapsulation)。数据抽象是一种依赖于 接口(interface)实现(implementation) 分离的编程(以及设计)技术。
类的接口包括用户所能执行的操作;类的实现则包括类的数据成员、负责接口实现的函数体以及定义类所需的各种私有函数。
封装实现了类的接口和实现的分离。封装后的类隐藏了它的实现细节,也就是说,类的用户只能使用接口而无法访问实现的细节。

7.1 定义抽象数据类型

7.1.1 设计Sales_data类

成员函数(member function)
使用改进的Sales_data类

在这里插入代码片

7.1.2 定义改进的Sales_data类

Note 定义在类内部的函数是隐式的inline函数。

定义成员函数

引入this
成员函数通过一个名为this的额外的隐式参数来访问调用它的那个对象。当我们调用一个成员函数时,用请求该函数的对象地址初始化this。
例如,如果调用

total.isbn();

则编译器负责把total的地址传递给isbn的隐式形参this,可以等价地认为编译器将该调用重写成了以下的形式:

//伪代码,用于说明调用成员函数的实际执行过程
Sales_data::isbn(&total)

任何自定义名为this的参数或变量的行为都是非法的。我们可以在成员函数体内部使用this。
因为this的目的总是指向“这个”对象,所以this是一个常量指针,我们不允许改变this中保存的地址。

引入const成员函数
相当抽象,没有理解来
类作用域和成员函数
编译器分两步处理类:
首先编译成员的声明,然后才轮到成员函数体(如果有的话)。
因此,成员函数体可以随意使用类中的其他成员而无需在意这些成员出现的次序。

在类的外部定义成员函数

7.1.3 定义类相关的非成员函数

Note 一般来说,如果非成员函数是类接口的组成部分,则这些函数的声明应该与类在同一个头文件内。

7.1.4 构造函数(constructor)

constructor
不同于其他成员函数,构造函数不能被声明成const的。
当我们创建一个const对象时,直到构造函数完成初始化过程,对象才真正取得其“常量”属性。因此,构造函数在const对象的构造过程中可以向其写值。
合成的默认构造函数
如果我们的类没有显式定义构造函数,那么编译器就会为我们隐式地定义一个默认构造函数。
编译器创建的构造函数又被称为合成的默认构造函数(synthesized defaule constructor)
对于大多数类来说,这个合成的默认构造函数将按照如下规则初始化类的数据成员:
●如果存在类内的初始值,用它来初始化成员。
●否则,默认初始化该成员。

某些类不能依赖于合成的默认构造函数

Note 只有当类没有声明任何构造函数时,编译器才会自动地生成默认构造函数。
WARNING 如果类包含有内置类型或复合类型的成员,则只有当这些成员全都被赋予了类内的初始值时,这个类才适用于合成的默认构造函数。

有的时候编译器不能为某些类合成默认的构造函数。
例如,如果类中包含一个其他类类型的成员且这个成员的类型没有默认构造函数,那么编译器将无法初始化该成员。
对于这样的类来说,我们必须自定义默认构造函数,否则该类将没有可用的默认构造函数。

定义Sales_data的构造函数

Best Practices 构造函数不应轻易覆盖掉类内的初始值,除非新赋的值与原值不同。如果你不能使用类内初始值,则所有构造函数都应该显示地初始化每个内置类型的成员。

注解:类内的初始值,应该是指声明时给变量赋的初始值
在类的外部定义构造函数

7.2.1 友元
类可以允许其他类或者函数访问它的非公有成员,方法是令其他类或函数成为它的友元(friend)。
如果类想把一个函数作为 它的友元,只需要增加一套以friend关键字开始的声明语句即可:

	friend Sales_data add(const Sales_data&, const Sales_data&);friend std::istream& read(std::istream&, Sales_data&);friend std::ostream& print(std::ostream&, const Sales_data&);

友元声明只能出现在类定义的内部,但是在类内出现的具体位置不限。友元不是类的成员也不受它所在区域访问控制级别的约束。

Tip 一般来说,最好在类定义开始或结束前的位置集中声明友元。

关键概念:封装的益处
封装有两个重要的优点:
● 确保用户代码不会无意破坏封装对象的状态。
● 被封装的类的具体实现细节可以随时改变,而无须调整用户级别的代码。
Note 尽管当类的定义发生改变时无须改变用户代码,但是使用了该类的源文件必须重新编译。

友元的声明
友元的声明仅仅指定了访问的权限,而非一个通常意义上的函数声明。如果我们希望类的用户能够调用某个友元函数,那么我们就必须在友元声明致亲爱再专门对函数进行一次声明。
注解:friend只是一个访问权限修饰符

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

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

相关文章

MyBatis快速入门教程

文章目录 一、介绍什么是持久层为什么要学MyBatis? 二、如何获得MyBatis?三、第一个Mybatis程序数据库导入maven依赖bean 实体类dao持久层resources编写对应的映射文件 mybatis主配置文件测试类运行遇到报错Could not find resource com/qibu/dao/IUserD…

超越Devin!姚班带队,他们创大模型编程新世界纪录

超越Devin!SWEBench排行榜上迎来了新玩家—— StarShip CodeGen Agent,姚班带队初创公司OpenCSG出品,以23.67%的成绩获得全球第二名的成绩。 同时创造了非GPT-4o基模的最高纪录(SOTA)。 我们都知道,SWEBe…

TinyMCE 富文本编辑器:打造个性化编辑体验

本文由ScriptEcho平台提供技术支持 项目地址:传送门 TinyMCE 富文本编辑器:打造个性化编辑体验 应用场景介绍 TinyMCE 是一款功能强大的富文本编辑器,广泛应用于网站内容管理、博客创作、在线文档编辑等场景。它提供了一系列丰富的编辑功…

微服务学习Day8-Sentinel

文章目录 Sentinel雪崩问题服务保护框架Sentinel配置 限流规则快速入门流控模式流控效果热点参数限流 隔离和降级FeignClient整合Sentinel线程隔离(舱壁模式)熔断降级 授权规则及规则持久化授权规则自定义异常结果持久化 Sentinel 雪崩问题 服务保护框架…

产品评测:Coolmuster Android Eraser - 安全彻底删除Android数据的利器

产品概述 在数字化时代,智能手机成为了个人敏感信息的集中地。当涉及到数据隐私和安全时,简单的删除操作并不能满足我们对数据彻底清除的需求。Coolmuster Android Eraser正是为了解决这一问题而生,它是一款专为Android设备设计的第三方软件&…

活动预告|6月13日Apache Flink Meetup·香港站

6 月 13 日 | 香港 | 线下 Apache Flink Meetup 的风吹到了香江之畔,Apache Flink 香港 Meetup 来啦!本次活动,我们邀请了来自阿里云的顶尖专家,帮助开发者全面了解 Apache Flink 的流批一体的数据处理能力,流式数据湖…

AGP8+ android.useNewApkCreator‘ is deprecated 打包失败

问题 新建一个项目,默认使用最新版的 AGP 和 Gradle,打包构建立马失败! 错误日志 Caused by: com.android.builder.errors.EvalIssueException: The option android.useNewApkCreator is deprecated. An exception occurred applying plu…

互动直播 之 从多人连麦列表中, 选择需要展示的连麦者

目录 一、需要展示的人数 1、判断上课方式 2、双屏不同模式区分

【xilinx】vivado中的xpm_cdc_gray.tcl的用途

背景 【Xilinx】vivado methodology检查中出现的critical Warning-CSDN博客 接上篇文章,在vivado进行 methodology检查时出现了严重警告,顺着指示查到如下一些问题 TIMING #1 Warning An asynchronous set_clock_groups or a set_false path (see con…

微信小程序蓝牙连接部分Android14调用wx.setBLEMTU协商低功耗最大传输单元失败解决方案(部分安卓14设置超过23就会报错)

1.解决方案的核心内容:第一次设置失败不要管,在complate函数里面继续往下连接,然后设置一个定时器每1秒钟在重新设置一次,肯定会成功的!!!!!!!&am…

零基础写框架:从零设计一个模块化和自动服务注册框架

模块化和自动服务注册 基于 ASP.NET Core 开发的 Web 框架中,最著名的是 ABP,ABP 主要特点之一开发不同项目(程序集)时,在每个项目中创建一个模块类,程序加载每个程序集中,扫描出所有的模块类,然后通过模块…

【Elasticsearch】IK分词器的下载及使用

安装IK分词器 网址:https://github.com/infinilabs/analysis-ik 3.1.在线安装ik插件(较慢,不推荐) # 进入容器内部 es为容器名称 docker exec -it es /bin/bash# 在线下载并安装 7.17.21为镜像版本要与之前保持一致 ./bin/elasticsearch-pl…

筛斗数据清洗技术在客户需求分析中的应用

在当今的商业环境中,了解客户需求对于企业的成功至关重要。然而,随着数据的不断增长和多样化,如何从海量的数据中提取有价值的信息成为了一个挑战。数据清洗技术作为一种有效的数据处理方法,可以帮助企业清除无效、错误的数据&…

uniapp uni.showModal 出现点击没有反应

uni.showModal 里面有好些参数 点击后不弹出 是因为 出现了 null 或者undifind 字符 特别是content 里面 title: 提示, cancelColor: #000000, editable: true,//是否显示输入框 content: item.text?item.te…

Python变量数组:深入探索其定义、用法、特性及高级技巧

Python变量数组:深入探索其定义、用法、特性及高级技巧 在Python编程中,变量数组是一种强大的数据结构,它允许我们存储和操作一组相关的数据项。然而,对于初学者来说,变量数组的概念和用法可能会带来一些困惑和挑战。…

【java11】java11新特性之标准HttpClient

Java 9中引入了增强的HttpClient API作为实验性功能。在Java 11中,现在HttpClient是一个标准。 Java 11引入了一个新的标准HttpClient API,用于替代旧的HttpURLConnection,提供了更现代、更灵活的HTTP通信方式。这个API支持同步和异步请求、…

Anacode+YOLO识别图片

一、安装Anacoda 因为我原本是已经安装了python,后面直接卸载了,然后安装了最新版的anacoda 下载网址为: Index of /anaconda/archive/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 下载版本是: 按照安装教程直接…

android framework input 及多指协议 (一)

触摸事件查询 getevent -lrt 以上数据格式:时间,具体节点文件名,事件类型,事件值 input问题排查,如果数据能打印出来,则是framework 问题,如果没有数据打印出来,则要看驱动问题。 …

80V高耐压低静态线性稳压器/LDO,Vout 1v-65v 3.3V及5V方案最佳选择

概述 PC93XX系列专为动力而设计-敏感应用程序。它包括一个精度第二个高压输入级,超低功率 偏置电流分支,并产生超低功率和低压差线性调节器。PC93XX通过输入电压工作VOUT1V至65V,仅消耗1.8μA的静态电流,并提供1%的初始精度和低…

kernelbase.dll故障怎么处理的几种常见方法,有效的解决kernelbase.dll故障

kernelbase.dll是 Windows 操作系统的一个系统文件,它是 Windows NT 基本 API 客户端库的一部分。如果你遇到了kernelbase.dll出现故障的情况,这可能会导致软件崩溃或无法正常运行。下面是一些处理kernelbase.dll故障的常见方法。 重新启动计算机&#x…