对于c++的总结与思考
笔者觉得好用的学习方法:模板法
1.采用原因:由于刚从c语言面向过程的学习中解脱出来,立即把思路从面向过程转到面向对象肯定不现实,加之全新的复杂语法与操作,着实给新手学习这门语言带来了不小的困难。所以,笔者探索出了一种好用的学习方法:模板法。
2.采用方法:在接触新知识时,没有必要从一开始便理清新知识的来龙去脉,可以先去csdn上学习新知识的模板和语法,再写一些简单程序以强化理解。在听完学校的课程后,写作业时,可以先使用ai写一道简单题并学习其格式和逻辑,再自己写难题
笔者觉得好用的纠错方法:程序示踪法
1.采用范围:程序报错且错误在认知范围内,如果遇到认知范围外的错误或者不报错却运行不了,请直接找老师解决或者用AI检验
2.为什么笔者觉得它比调试更加高效?因为在调试的时候,为了理清监视变量的变化,需要在循环的每一步认真分析,这样会浪费大量时间。所以,笔者在程序报错时,首先会检查指针越界和数组循环问题,然后分块将代码注释并运行,通过成功运行的部分不断扩大最终找到问题所在,或者当itc报错而不显示输入数据时,在每次输入后都打印一遍以获得数据,在检查类的析构,构造,组合,多态等复杂的问题时,让每个函数都打印特定的值,以确定函数失效的部分
类与对象
1.数据的封装:在一个类中,有public,private,protected三种成员,它们对应了不同的保密程度,这点与数据封装有关,它们的区别是public可以由任意操作进行访问,而protected只能由本类和子类的成员函数访问(子类笔者下文会讲),private的封装性更好,只能由本类的成员函数访问(注意:在自己写题的时候尽量写成public类,一是写题没有封装性要求,二是防止因自己写的子类函数无法访问基类成员而纠错),三种成员必须显示声明如public:再写public类型的数据成员与成员函数,否则默认为private类型。
2.成员:在一个类中,有几个固定的组成部分:数据成员与成员函数。其中成员是类所具有的数据,如整型,浮点型,字符型,数组指针甚至其他的类。具体参考c语言的结构体,而成员函数有以下三种:构造函数(必须显示声明,分为三种:默认构造函数,赋值构造函数与复制构造函数,默认构造函数的格式为类型名(){}; ,赋值构造函数就和普通的函数一样,将实参复制为形参,复制后释放,复制构造函数既可以显示声明也可以不声明,系统自己会生成一个,但如果要用记得声明,它的格式如下):
class good
{
public:
int b;
good(){};
good(const good &a)
{
b=a.b;
}
};
普通成员函数:和写在类外的函数只有一个区别,就是它可以调用本类中的一切数据成员
析构函数,与构造函数的格式类似,前面需要加一个~(小提示:键盘左上角),它可以自己定义,或者由系统自动生成,往往与打印某些语句有关。
3.new与delete,这两个函数的使用参考malloc与free,笔者在动态内存存储中有讲,动态内存管理-CSDN博客,只要使用了new,就必须显示声明析构函数并将空间delete掉(delete[]表示释放一个数组的空间),至于原因,就由下面的话题来解释◕‿◕
深拷贝与浅拷贝
1.不出意外,我们的所有数据都进行了深拷贝,即成功拷贝,可以理解为不报错的拷贝。
2.但是不出意外的情况下还是出意外了,当我们准备拷贝指针以及指针类型的数据(字符串,数组,函数,类)时出现了一个问题,这些拷贝的都是目标内存空间的地址,地址只有一个,所以,当复制构造完成时,我们的对象a(书接上文代码)就被释放了,而这些空间被释放后,原对象也会对这些空间进行释放,但它们已经不存在了,所以就出现了错误。
3.解决方法:给这些数据一个新的空间,把指针指向的数据放进去,这时候指针只是一个媒介,只是指指路,真正操作的是它指向空间的数据
4.代码演示
class good
{
public:
int *p;//此处一般为数组good (const good& d)//拷贝构造函数,深拷贝版
{p = new char[strlen(d.p) + 1];//为这个指针申请一个新空间if (p != 0){strcpy(p, d.p);//只操作数据,不操作指针,析构记得delete};
函数重载(引入重要思想多态性)
1.为什么要有多态性:俗话说:“一千个读者就有一千个哈姆雷特”,在生活中,我们使用同一个工具,在不同场景中的使用方法和结果是不一样的,而c++中的函数重载正是还原了这点。一个函数,因为参数,函数体,返回结果的不同,实现了多种实现方式,这就是传说中的多态性。
2.函数重载的方法:一个函数名,因不同参数而产生不同情况。所以可以在这些情况下随意使用,不需要写多个函数,增加了代码的可读性,代码如下:
int add(int a,int b)
{
return a+b;
}
float add(float a,float b)
{
return a+b;
}
类的组合与类的继承(引入重要思想继承)
1.为什么要引入类的组合与类的继承?因为c++在尽力复刻生活中的关系,比如机器与零件的组合关系以及父与子之间的继承关系。
2.格式:类的组合在大类中的声明和数据成员一样,如good a;,但注意组合类的声明必须在大类之前,类的继承必须保证基类函数在子类函数之前声明,继承有三种方式,public,protected和private,不同的方式下继承导致成员类型发生变化的情况如下表:

3.继承格式:class 子类名:继承方式 基类名
4.继承方式分为单继承与多继承,即父类与子类对象一对一和多对一,已知子类可以调用父类的成员和成员函数,那么出现重叠怎么办?所以,就有了如下定义:
虚基类,虚函数与抽象类,顺序问题
1.虚基类引入目的:解决代码在多继承中出现的冲突问题,由最远的基类成员来提供基类数据,注意引入时要在第一级继承时将共同基类设置为虚基类(在继承类型前加virtual )
2.顺序问题请看下表

注意析构函数的执行过程与构造函数相反,先构造后析构。
3.虚成员函数(必须为非静态函数):它的功能是在基类中定义的虚函数,子类可根据自身情况进行覆写以达到不同的需求。格式就是在函数前面加上virtual
4.虚析构函数(用的少):作用就是通过基类指针删除对象或者调用对象的析构函数,格式就是在~前加个virtual
5.纯虚函数与抽象类:当一个函数虚到只有一个函数名是重要的时候,会以virtual 函数名 形参表=0的形式输出,而含有纯虚函数的类叫做抽象类,它具有以下特点:

6.每个子类都要把基类的全部纯虚函数都重写一遍,哪怕是空函数,注意是全部!
运算符重载
1.通过运算符重载,我们就可以实现有关类的一切运算
2.运算符重载有两种方式,一种是类的成员函数,一种是类的友元函数(在函数或者类前面加个friend代表此函数或者此类可以访问该类的成员及成员函数),前者的格式为:返回类型 operator& 需要重载的运算符(除了本类外的其他参数或类){实现过程}(注意*this代表本函数的指针),后者的格式就是在前者格式的最前面加一个friend在参数多加一个类)
3.本快知识就是模板,笔者做过一道题,读者可以参考一下,模板和方法比较全:
【问题描述】实现Mystring类,类结构如下
class MyString{
private:
char str[1024];
unsigned len;/*字符串长度*/
public:
MyString()
MyString& operator=(const char *mstr)/*常量字符串赋值*/
MyString& operator=(const MyString mstr)/*同类型赋值*/
MyString operator+(const MyString mstr)/*字符串拼接*/
char &operator [](int i)/*查询串内字符*/
bool operator==(const MyString mstr)/*判断是否相等*/
bool operator!=(const MyString mstr)/*判断是否不等*/
void operator+=(const MyString mstr)/*字符串拼接赋值*/
bool operator>(const MyString mstr)/*按典序比较*/
bool operator<(const MyString mstr)}/*同上*/
friend ostream &operator<<(ostream &out,const MyString mstr);/*友元输出流符号重载*/
};
主函数结构如下:
int main()
{
char ts[1024];
cin>>ts;
MyString s;
s = ts;
cin>>ts;
MyString ss;
ss = ts;
if(ss == s)
cout<<"equal"<<endl;
if(ss != s)
{
cout<<"Not equal"<<endl;
if(s > ss)
cout<<"s da yu ss"<<endl;
if(s < ss)
cout<<"s xiao yu ss"<<endl;
}
ss += s;
MyString sss;
sss = s + ss;
sss[0] = '$';
cout<<sss<<endl;
return 0;
}
#请勿修改主函数,请勿使用C++的string类#
【输入形式】两个字符串,以换行隔开;
【输出形式】调用所给main函数
【样例输入】
abcd
abcde
【样例输出】
Not equal
s xiao yu ss
$bcdabcdeabcd
运算符重载 · 王赫辰/c语言 - Gitee.com
相关文章:
对于c++的总结与思考
笔者觉得好用的学习方法:模板法 1.采用原因:由于刚从c语言面向过程的学习中解脱出来,立即把思路从面向过程转到面向对象肯定不现实,加之全新的复杂语法与操作,着实给新手学习这门语言带来了不小的困难。所以ÿ…...
Flask 账号详情展示
Flask 账号详情展示 这段代码是一个基于Flask框架的Python应用程序。 它包含了两部分代码:Python代码和HTML代码。 web/templates/common/tab_account.html <div class"row border-bottom"><div class"col-lg-12"><div cla…...
软件测试/测试开发丨Pytest 参数化用例
参数化 通过参数的方式传递数据,从而实现数据和脚本分离。并且可以实现用例的重复生成与执行。 参数化应用场景 测试登录场景 测试登录成功,登录失败(账号错误,密码错误)创建多种账号: 中⽂文账号,英⽂文账号 普通测试用例方法 …...
MATLAB中./和/,.*和*,.^和^的区别
MATLAB中./和/,.*和*,.^ 和^ 的区别 MATLAB中./和/,.*和*,.^ 和^ 的区别./ 和 / 的区别.//实验实验结果 .* 和 * 的区别.**实验实验结果 .^ 和^ 的区别.^n^n实验运行结果 MATLAB中./和/,.和,.^ 和^ 的区别 …...
Flask 与微信小程序对接
Flask 与微信小程序的对接 在 web/controllers/api中增建py文件,主要是给微信小程序使用的。 web/controllers/init.py # -*- coding: utf-8 -*- from flask import Blueprint route_api Blueprint( api_page,__name__ )route_api.route("/") def ind…...
node.js express框架开发入门教程
文章目录 前言一、Express 生成器(express-generator)二、快速安装1.express框架express-generator生成器安装2.使用pug视图引擎创建项目,projectName 为项目名称自定义 三、安装热更新插件 nodemon四、目录结构1. public文件夹2.routes路由其他请求方式…...
Spring系列学习二、Spring框架的环境配置
Spring框架的环境配置 一、Java环境配置二、 Spring框架的安装与配置三、Maven与Gradle环境的配置四、IDE环境配置(Eclipse与IntelliJ IDEA)五、结语 一、Java环境配置 所有编程旅程总是得从基础开始,如同乐高积木大作的基座,首先…...
基于飞浆OCR的文本框box及坐标中心点检测JSON格式保存文本
OCR的文本框box及JSON数据保存 需求说明 一、借助飞浆框出OCR识别的文本框 二、以圆圈形式标出每个框的中心点位置 三、以JSON及文本格式保存OCR识别的文本 四、以文本格式保存必要的文本信息 解决方法 一、文本的坐标来自飞浆的COR识别 二、借助paddleocr的draw_ocr画出…...
ubuntu 安装docker GPG error缺少公钥解决方法
文章目录 报错信息解决方案 报错信息 W: GPG error: http://mirrors.aliyun.com/docker-ce/linux/ubuntu focal InRelease: The following signatures couldn’t be verified because the public key is not available: NO_PUBKEY 7EA0A9C3F273FCD8 E: The repository ‘http:…...
Laravel的知识点
1.{{ }} 是在 HTML 中内嵌 PHP 的 Blade 语法标识符,表示包含在该区块内的代码都将使用 PHP 来编译运行。 2.两种写法 3.return void 在这段注释中,"return void" 表示该函数或方法没有返回值。这意味着它执行某些操作或任务,但…...
STM32 基础知识(探索者开发板)--103讲 通用定时器
定时器溢出时间计算方法: Tout ((arr 1) * (psc 1)) / Ft us arr:自动重装载值 psc:时钟预分频数 定时器相关实验通用步骤 1.定时器初始化 a.定义结构体句柄 b.设基地址 c.设分频系数 d.设自动重装载值 e. 设计数模式 f.初始化定时器 2.外设模式配置 a.设置模式 d.映…...
mysqld_exporter使用
下载自己解压好 https://github.com/prometheus/mysqld_exporter/releases/download/v0.15.1/mysqld_exporter-0.15.1.linux-amd64.tar.gz在需要监控的数据库上执行 CREATE USER monit_test* IDENTIFIED BY Sfn4ZCHsK WITH MAX_USER_CONNECTIONS 3; GRANT PROCESS, REPLICATI…...
Java 解决远程调用 ssl 证书认证问题
Java 解决远程调用 ssl 证书认证问题 方法 1方法 2方法 3 方法 1 在 jdk 目录导入证书。 首先要下载 服务器 ssl 证书,下载完成之后。把它命名成 Root.cer 后面使用 cmd 命令行 在 jdk 目录导入。 例如 : jdk 的目录为:D:\JetBranins\Intel…...
kubernetes(k8s) Yaml 文件详解
YAML格式:用于配置和管理,YAML是一种简洁的非标记性语言,内容格式人性化,较易读。 1、查看API 资源版本标签 kubectl api-versions 2、编写资源配置清单 kubectl create -f nginx-test.yaml --validatefalse 2.3 查看创建的po…...
手拉手后端Springboot整合JWT
环境介绍 技术栈 springbootmybatis-plusmysqljava-jwt 软件 版本 mysql 8 IDEA IntelliJ IDEA 2022.2.1 JDK 1.8 Spring Boot 2.7.13 mybatis-plus 3.5.3.2 Json Web令牌简称JWT Token是在服务端产生的一串字符串是客户端访问资源接口(AP)时所需要的资源凭证。…...
小狐狸GPT付费2.4.9 去除授权弹窗版
后台安装步骤: 1、在宝塔新建个站点,php版本使用7.2 、 7.3 或 7.4,把压缩包上传到站点根目录,运行目录设置为/public 2、导入数据库文件,数据库文件是 /db.sql 3、修改数据库连接配置,配置文件是/.env 4、…...
Scrapy爬虫中合理使用time.sleep和Request
概述 在Scrapy爬虫中,我们需要深入分析time.sleep和Request对象对并发请求的影响。time.sleep函数用于在发起请求之前等待一段时间,而Request对象用于发送HTTP请求。我们必须仔细考虑这些操作对其他并发请求的潜在影响,以及在异步情况下可能…...
在Spring Cloud中使用Ribbon完成一个简单的负载均衡demo
Spring Cloud系列断更了有一段时间了,这段时间最近都在忙着项目上的事,天天修复bug以及调整需求,反正各种操劳,了解业务需求,然后开发相关功能,很久都没碰Spring Cloud系列的相关文章了,最近回头…...
mysql-5.6.16的内存泄漏问题
一、背景 有一台物理机上一个版本为5.6.16的从库出现了内存的增高,观测其日志可以发现,这台数据库已经oom很多次了,并且stop slave的时候会卡住非常长的时间才能停止 二、根本原因 上述的现象可以看到是一个明显的内存泄漏现象,…...
相机内参标定理论篇------相机模型选择
相机种类: 当拿到一款需要标定内参的相机时,第一个问题就是选择那种的相机模型。工程上相机类型的划分并不是十分严格,一般来说根据相机FOV可以把相机大概分为以下几类: 长焦相机:< 标准相机:~&…...
Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...
抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...
【Redis】笔记|第8节|大厂高并发缓存架构实战与优化
缓存架构 代码结构 代码详情 功能点: 多级缓存,先查本地缓存,再查Redis,最后才查数据库热点数据重建逻辑使用分布式锁,二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...
RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)
RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发,后来由Pivotal Software Inc.(现为VMware子公司)接管。RabbitMQ 是一个开源的消息代理和队列服务器,用 Erlang 语言编写。广泛应用于各种分布…...
探索Selenium:自动化测试的神奇钥匙
目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...
tomcat指定使用的jdk版本
说明 有时候需要对tomcat配置指定的jdk版本号,此时,我们可以通过以下方式进行配置 设置方式 找到tomcat的bin目录中的setclasspath.bat。如果是linux系统则是setclasspath.sh set JAVA_HOMEC:\Program Files\Java\jdk8 set JRE_HOMEC:\Program Files…...
Elastic 获得 AWS 教育 ISV 合作伙伴资质,进一步增强教育解决方案产品组合
作者:来自 Elastic Udayasimha Theepireddy (Uday), Brian Bergholm, Marianna Jonsdottir 通过搜索 AI 和云创新推动教育领域的数字化转型。 我们非常高兴地宣布,Elastic 已获得 AWS 教育 ISV 合作伙伴资质。这一重要认证表明,Elastic 作为 …...
全面解析数据库:从基础概念到前沿应用
在数字化时代,数据已成为企业和社会发展的核心资产,而数据库作为存储、管理和处理数据的关键工具,在各个领域发挥着举足轻重的作用。从电商平台的商品信息管理,到社交网络的用户数据存储,再到金融行业的交易记录处理&a…...
海云安高敏捷信创白盒SCAP入选《中国网络安全细分领域产品名录》
近日,嘶吼安全产业研究院发布《中国网络安全细分领域产品名录》,海云安高敏捷信创白盒(SCAP)成功入选软件供应链安全领域产品名录。 在数字化转型加速的今天,网络安全已成为企业生存与发展的核心基石,为了解…...
用 Rust 重写 Linux 内核模块实战:迈向安全内核的新篇章
用 Rust 重写 Linux 内核模块实战:迈向安全内核的新篇章 摘要: 操作系统内核的安全性、稳定性至关重要。传统 Linux 内核模块开发长期依赖于 C 语言,受限于 C 语言本身的内存安全和并发安全问题,开发复杂模块极易引入难以…...
