C++类与对象(一)—学习记录

        序言:要想开发一款成功的应用程序,其开发者必须充分了解并实现用户的需求。作为一个设计良好的类,既要有直观且易于使用的接口,也必须具备高效的实现过程。


一、类与对象基本概念

        面向对象程序设计的主要特点为抽象封装继承多态,而类是面向对象程序设计方法的核心概念。类的基本思想是问题抽象和封装,问题抽象是一种依赖于接口和实现分离的编程(以及设计)技术,封装则实现类的接口和实现分离且隐藏实现细节[1-2]

        问题抽象,包括数据抽象行为抽象。数据抽象是为了描述某类对象的属性或状态,行为抽象是为了描述某类对象的共同行为或功能特征。

        封装,将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体。换言之,将数据与操作数据的函数代码进行整合并形成“类”,其中的数据和函数都是类的成员。

注意事项与编码规范:

1. 类本身就是一个作用域,类的成员函数的定义嵌套在类的作用域之内;

2. 定义在类内部的函数是隐式的inline函数(内联函数较于普通函数可以减少调用的开销、提高执行效率,但会增加编译后代码的长度);

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

二、类的基本构成

(一)构造函数

        在定义对象的时候进行的数据成员设置,称为对象的初始化。构造函数是类的一个成员函数,其特点有:函数名与类名相同,没有返回值,公有访问,其作用就是在对象被创建时利用特定的值构造对象,将对象初始化为一个特定的状态。一个类可以包含多个构造函数(函数重载),不同的构造函数之间必须在参数数量或参数类型上有所差异。

        如果类中没有写构造函数,编译器会自动生成一个隐含的默认构造函数,该构造函数的参数列表和函数体皆为空(在建立对象时自动调用构造函数是C++程序“例行公事”的必然行为)。对于默认构造函数而言,如果存在类内的初始值即用此初始化成员,否则默认初始化该成员(赋空值)。

        形如 Sales_data(const std::string &s):bookNo(s){}; 的对象初始化方式,":"以及":"与”{}“之间的代码称为构造函数初始值列表。构造函数初始值列表的作用是为新创建的对象的一个或几个数据成员赋初值。构造函数初始值是成员名字的一个列表,每个名字后面紧跟括号括起来的(或者在花括号内的)成员初始值。不同成员的初始化通过逗号分隔开来[2-p238]

注意事项:

1. 在C++11新标准中,如果需要显式默认构造函数,在类内可以通过 类名()=default; 方式实现;

2. 编译器只有在发现类不包含任何构造函数的情况下才会自动生成一个默认的构造函数。一旦定义了一些其他的构造函数,除非再次定义一个默认的构造函数,否则类将没有默认构造函数;

3. 如果类包含有内置类型或者复合类型(如数组或指针)的成员,则只有当这些成员全都被赋予了类内的初始值时,这个类才适合于使用合成的默认构造函数;

4. 有的时候编译器不能为某些类合成默认构造函数。例如,如果类内包含一个其他类类型的成员且这个成员的类型没有默认构造函数,那么编译器将无法初始化该成员。

(二)复制构造函数

        复制构造函数是一种特殊的构造函数,具有一般构造函数的所有特性,其形参是本类的对象的引用。其作用是使用一个已经存在的对象(由复制构造函数的参数指定),去初始化同类的一个新对象。

        复制构造函数会被调用的三种情况:

        1.  当用类的一个对象去初始化该类的另一个对象时;

        2. 如果函数的形参是类的对象,调用函数时,进行形参和实参结合时(只有把对象用值传递才会调用复制构造函数。引用传递则不会调用复制构造函数);

        3. 如果函数的返回值是类的对象,函数执行完成返回调用者时。

注意事项:

1. 如果没有定义类的复制构造函数,系统就会在必要时自动生成一个默认的复制构造函数。这个隐含的复制构造函数会把初始值对象的每个数据成员的值都复制到新建立的对象中;

2. 当类的数据成员中有指针类型时,默认的复制构造函数实现的只能是浅复制。浅复制会带来数据安全方面的隐患,要实现正确的复制,也就是深复制,必须编写复制构造函数。

(三)析构函数

        析构函数与构造函数的作用几乎正好相反,它用来完成对象被删除前的一些清理工作。析构函数是在对象的生存期即将结束的时刻被自动调用的,完成调用后,对象相应的内存空间也被释放。

        析构函数是类的一个公有函数成员,它的名称是由类名前面加”~“构成,没有返回值。和构造函数不同的是析构函数不接收任何参数,但可以是虚函数。如果不进行显式说明,系统也会生成一个函数体为空的默认析构函数。

注意事项:

1. 很多需要动态内存的类应该使用vector对象或者string对象管理必要的存储空间。使用vector或者string的类能避免分配和释放内存带来的复杂性,因为如果类包含vector或者string成员,则其拷贝、赋值和销毁的编译器自动合成版本函数能够正常工作;

2. 如果希望程序在对象被删除之前的时刻自动完成某些事情,就可以把它们写到析构函数中。

(四)访问控制与封装

1、访问控制属性  

        对类成员访问权限的控制,是通过设置成员的访问控制属性而实现的。访问控制属性可以有以下3种:公有类型(public)、私有类型(private)和保护类型(protected)。

        公有类型成员定义了类的外部接口,在类外只能访问类的公有成员。私有成员只能被本类的成员函数访问,来自类外部的任何访问都是非法的。保护类型成员的性质和私有成员的性质相似,其差别在于继承过程中对产生的新类影响不同。

2、友元 

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

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

3. 封装的益处

        (1)确保用户代码不会无意间破坏封装对象的状态;

        (2)被封装的类的具体实现细节可以随时改变,而无需调整用户级别的代码。

三、结构体(Struct)和联合体(Union)

(一)结构体

        C++中引入结构体是为了保持和C程序的兼容性。C语言只有结构体而没有类,C语言的结构体中只允许定义数据成员,不允许定义函数成员,而且C语言没有访问控制属性的概念,结构体的全部成员是公有的。

        结构体可以使用{实际参数}进行初始化,这是一种聚合初始化的方式(类必须构造函数)。编译器会按照成员声明的顺序,将{}中的值依次赋给结构体的成员变量。具体形式如下:

struct aClass {int aa;int bb;int cc;};

aClass aa = {1,2,3};

(二)联合体

        联合体从C语言继承而来,默认访问控制属性也是公有类型。联合体的全部数据成员共享同一组内存单元,其成员同时至多只有一个是有意义的(即不能同时存储多个成员的值)。

        在给Union中的某个成员赋值后,其他成员的值将被覆盖;Union的字节存储大小由其最大字节存储大小的成员决定;Union可以在定义时直接初始化,但只能对第一个定义成员进行初始化[3]

联合体限制[1]

①联合体的各个对象成员,不能有自定义的构造函数、自定义的析构函数和重载的复制赋值运算符,不仅联合体的对象成员不能有这些函数,这些对象成员的对象成员也不能有,以此类推。

②联合体不能继承,因而也不支持包含多态。

Union定义初始化测试结果图

参考资料:

[1]  C++语言程序设计 / 郑莉,董渊,何江舟编著.—4版.—北京:清华大学出版社,2010.7(清华大学计算机系列教材)

[2] C++ Primer中文版:第5版 /(美)李普曼(Lippman,S.B.),(美)拉乔伊(Lajoie,J.),(美)默(Moo,B.E.)著;王刚,杨巨峰译. —北京:电子工业出版社,2013.9.

[3] Union:联合体的使用与理解-百度开发者中心

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

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

相关文章

七大排序算法

文章目录 排序的概念及引用1.插入排序2.希尔排序(缩小增量排序)3.选择排序4.堆排序5.冒泡排序6.快速排序7.归并排序8.代码排序部分的测试9.代码加效果大致测试时间(仅供参考) 排序的概念及引用 排序:将数据按照特定的规律排成递增或递减的操作 稳定性:…

Windows 蓝牙驱动开发-蓝牙设备栈

蓝牙设备栈 蓝牙驱动程序堆栈包含 Microsoft 为蓝牙协议提供支持的核心部分。 有了这个堆栈,已启用蓝牙的设备可以彼此定位并建立连接。 在此类连接中,设备可以通过各种应用程序交换数据并彼此交互。 下图显示了蓝牙驱动程序堆栈中的模块,以…

C# 获取PDF文档中的字体信息(字体名、大小、颜色、样式等

在设计和出版行业中,字体的选择和使用对最终作品的质量有着重要影响。然而,有时我们可能会遇到包含未知字体的PDF文件,这使得我们无法准确地复制或修改文档。获取PDF中的字体信息可以解决这个问题,让我们能够更好地处理这些文件。…

第十三章:数据库技术

文章目录: 一:基础 1.概念 2.特点 3.常见数据库品牌 4.数据库应⽤系统 4.1 C/S 4.2 B/S 5.数据模型的分类 6.名词解析 7.关系运算 二:Access 1.基础 2.操作 2.1 建立表 2.2 维护表 2.3 创建查询 2.4 创建窗体 2.5 创建报表…

目标检测新视野 | YOLO、SSD与Faster R-CNN三大目标检测模型深度对比分析

目录 引言 YOLO系列 网络结构 多尺度检测 损失函数 关键特性 SSD 锚框设计 损失函数 关键特性 Faster R-CNN 区域建议网络(RPN) 两阶段检测器 损失函数 差异分析 共同特点 基于深度学习 目标框预测 损失函数优化 支持多类别检测 应…

浏览器输入http形式网址后自动跳转https解决方法

一、问题描述 使用浏览器 网上冲浪 时会遇到一个情况: 在浏览器中输入“http域名”后会自动变成“https 域名”的形式,此时“https 域名”的网站可能已停止对外提供服务了,这时会出现如下不友好的网页提示: 二、处理方法&#x…

Unity2017 控制.abc格式的三维动画播放

首先需要导入插件Alembic,否则导入abc动画,Unity是不会识别的。 Unity2017版本及以下直接从我这儿下载:https://download.csdn.net/download/qq_41603955/90272382 高版本Unity,请移步AssetStore商店搜找。 导入abc之后&#x…

python管理工具:conda部署+使用

python管理工具:conda部署使用 一、安装部署 1、 下载 - 官网下载: https://repo.anaconda.com/archive/index.html - wget方式: wget -c https://repo.anaconda.com/archive/Anaconda3-2023.03-1-Linux-x86_64.sh2、 安装 在conda文件的…

挖掘机检测数据集,准确识别率91.0%,4327张原始图片,支持YOLO,COCO JSON,PASICAL VOC XML等多种格式标注

挖掘机检测数据集,准确识别率91.0%,4327张图片,支持YOLO,COCO JSON,PASICAL VOC XML等多种格式标注 数据集详情 数据集分割 训练组70% 3022图片 有效集20% 870图片 测试集10&…

vue 学习笔记 - 创建第一个项目 idea

1、安装Vue CLI 查看npm版本号 (可跳过) % npm -v 11.0.0安装Vue CLI % npm install -g vue/cli2、创建项目 进入工程文件目录 % cd /Users/ruizhifeng/work/aina-client查看vue 版本号 (可跳过) % vue --version vue/cli 5…

BIO、NIO、AIO

第一章 BIO、NIO、AIO课程介绍 1.1 课程说明 ​ 在Java的软件设计开发中,通信架构是不可避免的,我们在进行不同系统或者不同进程之间的数据交互,或者在高并发下的通信场景下都需要用到网络通信相关的技术,对于一些经验丰富的程序员来说,Java早期的网络通信架构存在一些缺…

SpringMVC复习笔记

文章目录 SpringMVC 概念和基本使用SpringMVC 简介SpringMVC 核心组件和调用流程SpringMVC 基本使用第一步:导入依赖第二步:Controller 层开发第三步:SpringMVC 配置类配置核心组件第四步:SpringMVC 环境搭建第五步:部…

NEC纪实 :2024全国机器人大赛 Robocon 常州工学院团队首战国三

全国机器人大赛 Robocon 常州工学院团队首战国三 通宵7天7夜,常州工学院RC团队,首次闯入全国机器人大赛国赛,并成功得分! 不同于老牌强队,常州工学院(下面用"常工"代替)的这只队伍&…

Golang结合MySQL和DuckDB提高查询性能

要在Golang中组合MySQL和DuckDB以提高查询性能,请考虑使用混合查询执行方法。这种方法利用了MySQL强大的事务管理和DuckDB闪电般的分析处理能力。本文介绍如何充分利用两者的方法。 各取所长 用MySQL处理事务,用DuckDB处理分析 MySQL应该处理常规的INS…

数据结构-单向不带头不循环链表

链表知识总结 逻辑结构:线性结构(元素之间存在一对一关系) 存储结构(物理结构):链式存储(存储顺序和逻辑顺序不在乎是否一致) 1.链表的特点:擅长进行动态删除和增加操作&…

28:CAN总线入门一:CAN的基本介绍

CAN总线入门 1、CAN总线简介和硬件电路1.1、CAN简要介绍1.2、硬件电路1.3、CAN总线的电平标准 2、帧格式2.1、数据帧(掌握)2.2、遥控帧(掌握)2.3、错误帧(了解)2.4、过载帧(了解)2.5…

2018年西部数学奥林匹克几何试题

2018G1 在 △ A B C \triangle ABC △ABC 中, O O O 为外心, M M M 为边 B C BC BC 的中点, 延长 A B AB AB 交 ( A O M ) (AOM) (AOM) 于点 D D D, ( A O M ) (AOM) (AOM) 交 A C AC AC 于点 E E E. 求证: E C D M ECDM ECDM. 证明: 设点 G G G 为 △ A B C …

知识图谱抽取分析中,如何做好实体对齐?

在知识图谱抽取分析中,实体对齐是将不同知识图谱中的相同实体映射到同一表示空间的关键步骤。为了做好实体对齐,可以参考以下方法和策略: 基于表示学习的方法: 使用知识图谱嵌入技术,如TransE、GCN等,将实体…

UnityXR Interaction Toolkit 如何检测HandGestures

前言 随着VR设备的不断发展,从最初的手柄操作,逐渐演变出了手部交互,即头显可以直接识别玩家的手部动作,来完成手柄的交互功能。我们今天就来介绍下如何使用Unity的XR Interaction Toolkit 来检测手势Hand Gesture。 环境配置 1.使用Unity 2021或者更高版本,创建一个项…

Maven在Win10上的安装教程

诸神缄默不语-个人CSDN博文目录 这个文件可以跟我要,也可以从官网下载: 第一步:解压文件 第二步:设置环境变量 在系统变量处点击新建,输入变量名MAVEN_HOME,变量值为解压路径: 在系统变…