嵌入式入门Day40

C++ Day3

  • C++对C的结构体的扩充
    • this指针
    • 类的大小
    • 类中的特殊成员函数
      • 构造函数
  • 作业

在这里插入图片描述

C++对C的结构体的扩充

  1. C语言中的结构体,仅仅只是属性(变量)的聚合体,不可以在结构体中定义行为(函数)。如果非要在结构体中定义行为,则需要定义函数指针,并使用回调函数来实现。
  2. C++对C语言中的结构体,进行了翻天覆地的变化
  3. 在C++中的结构体中可以定义函数,而C语言中不可以,C++中结构体内定义函数往往是,结构体内声明,结构体外定义
  4. C++中的结构体,在定义变量时,可以不用加struct,而C语言中的结构体必须要加上
  5. C++中的结构体中可以再定义一个新的结构体类型,并且可以在外界直接使用,而C语言中的结构体不可以
  6. C++中的结构体,有访问权限,分别是public、private、protected,默认是public权限,C语言中的结构体没有访问权限
  7. C++中的结构体,可以被继承,继承方式有public、private、protected,默认是public权限,C语言中的结构体,不能被继承
  8. C++中的结构体,在声明类型时,可以给成员属性(变量)初始值,而C语言中的结构体不允许
  9. C++中的结构体,会默认提供一些特殊成员函数,如析构函数、拷贝赋值函数、移动赋值函数。C中的结构体没有

  1. 类的访问权限有三种:public、protected、private
    类的默认权限为private
  2. 类中可以有成员属性和成员函数,一般成员属性设置成私有、成员变量设置为公共的
  3. 类的成员函数可以访问类中所有权限下的成员,包括私有成员
  4. 每种访问权限可以在类中出现多次,从关键字开始一直到下一个关键字出现或者类体结束
  5. 如果非要在类外对私有或受保护的成员进行读取或写入,需要在类内提供相关的公共接口来操作
  6. 类的访问权限是针对于类体而言,而不是针对于类对象而言

定义格式


//一般出现在头文件中
class 类名 {成员类型 成员名;...成员函数声明;//例如void show();
};//一般出现在源文件中
void 类名::show()
{函数体;
}

this指针

  1. this指针是类中系统为所有非静态成员函数提供的一个隐藏的形参指针,指代当前对象的起始地址
  2. 指代当前对象,哪个对象使用我,我就指向哪个对象
  3. 在非静态成员函数中,如果调用了类中的成员(成员函数、成员变量),即使没有加this,系统也默认加了this。
  4. this的原型: 类名 * const this;
  5. 必须使用this的情况:
    • 当形参名和成员名同名时,可以使用this用于区分
    • 在拷贝赋值函数中,用于返回自身引用时,必须使用this

类的大小

  1. 一个空类的大小为 1 字节,用于占位作用,后期如果有成员变量,就会将该1字节空间分配给成员使用
  2. 类中的成员函数不占类体的大小,成员函数只有被调用时,才会分配空间
  3. 只有类的成员属性才占内存空间,其类的大小要遵循字节对齐原则
  4. 如果类中有虚函数,则会多一个虚指针的空间

类中的特殊成员函数

  1. 当定义一个空类时,即使没有手动定义某些函数,C++系统会默认自动为其提供一些特殊成员函数
  2. 这些函数也可以程序员手动定义,当手动定义后,系统就不再提供默认的了
  3. 这些函数也无需程序员手动调用,在特殊时期,C++系统会自动调用
  4. 种类:构造函数、析构函数、拷贝构造函数、拷贝赋值函数、移动构造函数、移动赋值函数、取地址运算符重载函数

构造函数

  1. 构造函数是在使用类实例化对象时,用于给类对象分配内存空间以及对成员进行初始化工作时使用
  2. 调用时机:无需程序员手动调用,当使用一个类实例化对象时,系统自动调用构造函数
  3. 调用格式:
    无参构造: 类名 对象名;
    例如:string s1;
    有参构造: 类名 对象名(实参列表);
    例如:string s2(“hello a”);
    string s3(5, ‘A’);
  4. 一个类中可以定义多个构造函数,要求参数必须不同,这些构造函数构成重载关系,虽然一个类中可以定义多个构造函数,但是一个类对象的只能使用一个构造函数构造出来
  5. 一个类中,如果没有显性定义任何构造函数,那么系统会默认提供一个无参构造函数,但凡类中提供任意一个构造函数,系统就不再提供默认的无参构造函数了,如果非要使用无参构造函数,需要程序员手动定义无参构造函数
  6. 构造函数的形参列表也可以设置默认参数,但是要注意是否跟其他重载的函数冲突
  7. 构造函数的初始化工作是在初始化列表中完成的。
    初始化列表:在构造函数函数头部后面,由冒号引出,完成初始化工作
    格式: 类名(形参类型1 形参1, 形参类型2 形参
  8. 必须使用构造函数的初始化列表的情况
    • 如果类的成员变量中有常成员变量,对该成员的初始化工作,必须使用初始化列表完成
    • 如果类中有引用成员,那么对该成员也必须使用初始化列表完成
    • 如果构造函数的形参名和成员变量同名时,可以使用初始化列表来解决
    • 如果一个类中,有另一个类的对象,对该成员对象的初始化工作需要在初始化列表中显性定义该成员对象的有参构造,否则系统会自动调用其无参构造
  9. 定义格式
class stu {
public: //类名(形式参数类别): 初始化列表 {函数体;}stu(string name, int age, double score) : name(name) , age(age) , score(socre) {函数体;}
};

作业

使用C++手动封装一个顺序表

//main.cpp
#include <iostream>
#include "seqlist.h"using namespace std;int main()
{//创建一个长度为5的顺序表Seqlist A(5);//循环输入30个数据,顺序表满时将会自动扩容for(int i = 0; i < 30; i++){A.insert_tail(i + 1);}cout << "初始顺序表" << endl;A.show();cout << "顺序表长度为:" << A.getlen() << endl;cout << "将22插入到第3位后" << endl;A.insert_pos(22,3);A.show();cout << "顺序表长度为:" << A.getlen() << endl;cout << "删除第二个元素后" << endl;A.delete_pos(2);A.show();cout << "顺序表长度为:" << A.getlen() << endl;cout << "删除最后一个元素后" << endl;A.delete_tail();A.show();cout << "第5个元素是:" << A.at(5) << endl;cout << "顺序表长度为:" << A.getlen() << endl;return 0;
}
//seqlist.h
#ifndef SEQLIST_H
#define SEQLIST_H#include <iostream>using namespace std;using datatype = int;class Seqlist
{
private:datatype *data;int size = 0;int len = 0;
public://无参构造,默认创建长度为10的顺序表Seqlist() :data(new datatype[10]), size(10), len(0){}//有参构造,创建指定长度的顺序表Seqlist(int size) :data(new datatype[size]), size(size), len(0){}//判空bool is_empty();//判满bool is_full();//尾插bool insert_tail(datatype e);//指定位置插入元素bool insert_pos(datatype e, int pos);//获取长度int getlen();//尾删bool delete_tail();//指定位置删除元素bool delete_pos(int pos);//访问任意一个元素datatype &at(int pos);//扩容函数void expend();//展示函数void show();//释放顺序表void free();
};#endif // SEQLIST_H
//seqlist.cpp
#include "seqlist.h"bool Seqlist::is_empty(){//判断实际长度为0即是表空if(len == 0){return true;}else{return false;}
}bool Seqlist::is_full(){//判断实际长度为最大值size时即是表满if(len == size){return true;}else {return false;}
}bool Seqlist::insert_tail(datatype e)
{//表满时调用expend扩容顺序表if(is_full()){expend();}//将数据存储在下标为实际长度len的元素中data[len] = e;len++;return true;
}bool Seqlist::insert_pos(datatype e, int pos)
{//表满时扩容if(is_full()){expend();}//插入必须在表的已用范围内if(pos < 0 || pos > len){cout << "位置非法" << endl;return false;}else{//从表尾开始将每个元素循环后移,给新数据腾出位置for(int i = len - 1;i >= pos - 1; i--){data[i+1] = data[i];}//插入新数据data[pos-1] = e;len++;return true;}
}//直接返回len
int Seqlist::getlen()
{return len;
}
//尾删
bool Seqlist::delete_tail()
{//表空时失败if (is_empty()) {return false;}len--;return true;
}//按位置删除
bool Seqlist::delete_pos(int pos)
{//表空时失败if(is_empty()){cout << "表已空" << endl;return false;}else if(pos < 0 || pos >= size){    //位置违法时失败cout << "位置非法" << endl;return false;}else{//从要删除的位置循环前移来删除for (int i = pos - 1; i < len; i++) {data[i] = data[i+1];}len--;return true;}
}//访问指定位置的函数
datatype &Seqlist::at(int pos)
{//位置非法时失败if(pos < 0 || pos >= size){return data[-1];}else{return data[pos-1];}
}//二倍扩容函数
void Seqlist::expend()
{//申请之前2倍的空间datatype *temp = new datatype[2*size];//将之前的数据拷贝到新空间memmove(temp, data, sizeof (datatype)*size);//释放之前的空间delete data;//将指针指向新的空间data = temp;//将temp指针置空temp = NULL;//顺序表容量扩容到2倍size *= 2;
}//遍历顺序表
void Seqlist::show()
{//遍历顺序表,每输出5个数据换行一次int count = 0;for (int i = 0;i < len; i++) {cout << data[i] << '\t';count++;if(count%5 == 0){cout << endl;}}if(count%5){cout << endl;}
}void Seqlist::free()
{//释放顺序表空间delete data;//指针置空data = NULL;
}

运行结果

在这里插入图片描述

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

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

相关文章

《自动驾驶与机器人中的SLAM技术》ch2:基础数学知识

目录 2.1 几何学 向量的内积和外积 旋转矩阵 旋转向量 四元数 李群和李代数 SO(3)上的 BCH 线性近似式 2.2 运动学 李群视角下的运动学 SO(3) t 上的运动学 线速度和加速度 扰动模型和雅可比矩阵 典型算例&#xff1a;对向量进行旋转 典型算例&#xff1a;旋转的复合 2.3 …

C语言教程——指针进阶(1)

目录 前言 1、字符指针 2、指针数组 3、数组指针 3.1数组指针 3.2&数组名VS数组名 3.3数组指针的使用 4、数组参数、指针参数 4.1一维数组传参 4.2二维数组传参 4.3一级指针传参 4.4二级指针传参 4.5总结 5、函数指针 5.1思考 总结 前言 我们在之前知道指针…

[应用类App] 轮廓线 aia源码 UI界面精美,画布实现手柄摇杆

屏幕数量&#xff1a;10个&#xff0c;仅主界面近3000代码块&#xff0c;请自行研究参考。 实现了手柄摇杆功能&#xff0c;界面做的比较好。 下载地址&#xff1a;轮廓线 aia源码 UI界面精美&#xff0c;画布实现手柄摇杆 - .aia 案例源码 - 清泛IT社区&#xff0c;为创新赋能…

C++—9、如何在Microsoft Visual Studio中调试C++

本文通过实例操作来介绍 Visual Studio 调试器的功能。调试器在运行过程中可提供许多方法让你查看代码的情况。 你可以逐步浏览代码、查看变量中存储的值、设置对变量的监视以查看值何时改变、检查代码的执行路径、查看代码分支是否正在运行等等。本实例主要是设置断点及查看内…

SpringBoot项目实战(39)--Beetl网页HTML文件中静态图片及CSS、JS文件的引用和展示

使用Beetl开发网页时&#xff0c;在网页中使用的CSS、JS、图片等静态资源需要进行适当的配置才可以展示。大致的过程如下&#xff1a; &#xff08;1&#xff09;首先Spring Security框架需要允许js、css、图片资源免授权访问。 &#xff08;2&#xff09;网站开发时&#xff0…

GetMaterialApp组件的功能与用法

文章目录 1. 知识回顾2. 使用方法2.1 源码分析2.2 常用属性3. 示例代码4. 内容总结我们在上一章回中介绍了"Get包简介"相关的内容,本章回中将介绍GetMaterialApp组件.闲话休提,让我们一起Talk Flutter吧。 1. 知识回顾 我们在上一章回中已经介绍过GetMaterialApp组…

插入实体自增主键太长,mybatis-plaus自增主键

1、问题 spring-boot整合mybtais执行insert语句时&#xff0c;主键id为长文本数据。 2、分析问题 1)数据库主键是否自增 2&#xff09;数据库主键的种子值设置的多少 3、解决问题 1&#xff09;数据库主键设置的时自增 3&#xff09;种子值是1 所以排查是数据库的问题 4、继…

【嵌入式硬件】嵌入式显示屏接口

数字显示串行接口&#xff08;Digital Display Serial Interface&#xff09; SPI 不过多赘述。 I2C-bus interface 不过多赘述 MIPI DSI MIPI (Mobile Industry Processor Interface) Alliance, DSI (Display Serial Interface) 一般用于移动设备&#xff0c;下面是接口…

(STM32笔记)十二、DMA的基础知识与用法 第三部分

我用的是正点的STM32F103来进行学习&#xff0c;板子和教程是野火的指南者。 之后的这个系列笔记开头未标明的话&#xff0c;用的也是这个板子和教程。 DMA的基础知识与用法 三、DMA程序验证1、DMA 存储器到存储器模式实验&#xff08;1&#xff09;DMA结构体解释&#xff08;2…

MySQL 如何赶上 PostgreSQL 的势头?

原文地址 我与 MySQL 社区的前辈交谈时&#xff0c;经常遇到这个问题&#xff1a;「为什么 MySQL 这么棒&#xff0c;而且&#xff08;至少根据 DB-Engines 的计算&#xff09;仍然比 PostgreSQL 更流行&#xff1b;但它的地位在下降&#xff0c;PostgreSQL 却势不可挡地越来越…

完全二叉树的删除

&#xff08;1&#xff09;删除叶子节点 找到要删除的节点 targetNode找到要删除节点的父节点parent&#xff08;父节点是否存在&#xff09;要删除的节点是父节点的左子树还是右子树如果是左子树&#xff0c;则parent.leftnull;如果是右子树则parent.rightnull。 &#xff08;…

Docker入门之docker基本命令

Docker入门之docker基本命令 官方网站&#xff1a;https://www.docker.com/ 1. 拉取官方镜像并创建容器&#xff08;以redis为例&#xff09; 拉取官方镜像 docker pull redis# 如果不需要添加到自定义网络使用这个命令&#xff0c;如需要&#xff0c;直接看第二步 docker r…

玩转大语言模型——ollama导入huggingface下载的模型

ollama导入huggingface模型 前言gguf模型查找相关模型下载模型 导入Ollama配置参数文件导入模型查看导入情况 safetensfors模型下载模型下载llama.cpp配置环境并转换 前言 ollama在大语言模型的应用中十分的方便&#xff0c;但是也存在一定的问题&#xff0c;比如不能使用自己…

DFS之迭代加深、双向DFS、IDA*

迭代加深 迭代加深&#xff1a; 170. 加成序列 满足如下条件的序列 X X X&#xff08;序列中元素被标号为 1 、 2 、 3 … m 1、2、3…m 1、2、3…m&#xff09;被称为“加成序列”&#xff1a; X [ 1 ] 1 X[1]1 X[1]1 X [ m ] n X[m]n X[m]n X [ 1 ] < X [ 2 ] < …

Ansible之批量管理服务器

文章目录 背景第一步、安装第二步、配置免密登录2.1 生成密钥2.2 分发公钥2.3 测试无密连接 背景 Ansible是Python强大的服务器批量管理 第一步、安装 首先要拉取epel数据源&#xff0c;执行以下命令 yum -y install epel-release安装完毕如下所示。 使用 yum 命令安装 an…

【Linux网络编程】第二十二弹---深入理解 I/O 多路转接之 epoll:系统调用、工作原理、代码演示及应用场景

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】【Linux网络编程】 目录 1、I/O 多路转接之 epoll 1.1、epoll 初识 1.2、epoll 的相关系统调用 1.2.1、epoll_create 1.2.2、epol…

双向列表的实现(C++)

一.实现思路 主要是一个空间存储一个数值&#xff0c;然后为了索引后面的数据单元和前面的数据单元&#xff0c;所以在每个空间里面还要存储前面和后面数据单元的指针&#xff0c;就形成了每个数据单元 后面就是要管理的是双向列表的头结点和尾节点&#xff0c;方便实现后面的头…

国产信创实践(国能磐石服务器操作系统CEOS +东方通TongHttpServer)

替换介绍&#xff1a; 国能磐石服务器操作系统CEOS 对标 Linux 服务器操作系统&#xff08;Ubuntu, CentOS&#xff09; 东方通TongHttpServer 对标 Nginx 负载均衡Web服务器 第一步&#xff1a; 服务器安装CEOS映像文件&#xff0c;可直接安装&#xff0c;本文采用使用VMware …

Linux——修改USB网卡设备节点名称

修改驱动&#xff1a; 测试&#xff1a; 参考资料&#xff1a; https://blog.csdn.net/ablexu2018/article/details/144868950

上手体验微软全新整合的王炸平台Fabric

体验确实不错&#xff0c;微软强大的生态能力。 把可视化&#xff0c;数仓&#xff0c;数据胡&#xff0c;数据工厂&#xff0c;机器学习&#xff0c;数据监控等技术都整合到一个平台了。所有数据全都存储在统一的one lake数据中心&#xff0c;消除数据孤岛问题。而且不同角色可…