【番外篇】C++语法学习笔记
学习目标:C++的一些高级操作
根据C++菜鸟教程自学的笔记,大家有想学习C++的话可以根据这个网站进行学习。这个推荐有一定基础的再去进行自学。新手的话还是建议直接看一些视频跟着学
学习内容:
1. 运算符重载
说到C++中的运算符重载,首先要明确平时使用的加、减、乘、除、与、或、非、输入、输出、赋值、自增自减等这些运算符其实就是运算符重载的特殊情况。这些特殊情况只能对C++中的基础数据类型进行操作,如:“int”、“double”等。 而如果是用户自己定义的类型呢?比如自己定义的类的对象进行运算,想让这些自定义类型也进行加、减、乘、除这些操作,就只能进行运算符重载。
(1).重载运算符的定义
Box是声明的一个类:Box operator+(const Box& b){Box box;box.length = this->length + b.length;box.breadth = this->breadth + b.breadth;box.height = this->height + b.height;return box;}
2.文件读取和写入
定义数据类型:#include
写文件:
ofstream outfile;
outfile.open("file.dat", ios::out | ios::trunc );
关闭文件outfile.close();读文件
ifstream afile;
afile.open("file.dat", ios::out | ios::in );
关闭文件infile.close();
3. 常量
const关键字的定义:
const int A = 1;
此时a为常量,是不可以修改的#define 预处理器
#define PI 3.1415926
宏定义的边际错误
#include <iostream>
using namespace std;#define cyy 10+1 int main()
{int area;const int a = 1;area = cyy * cyy;cout << area<<endl;///cout << cyy;//cyy的值为11return 0;
}
理想情况上面的代码输出的area值,应该为1111=121,但结果却为21
原因是宏定义的编辑效应产生的错误,代码将area = cyycyy看成了area = 10+1*10+1
在定义常量或宏定义时,应用大写字母表示常量,这是很好的编程方式
4. 变量的作用域
全局变量:所有函数和代码块之外声明的变量,可以被任何代码中的函数访问,程序开始时创建,程序 结束时销毁。局部变量:局部变量是在函数内部定义的量块变量:块变量是在if,while中定义的使用外部链接的函数或全局变量,使用extern函数
extern关键字,是在多个文件使用同一个变量时的声明方式
#include <iostream>
int a = 1;
void func()
{int a = 10;{int a = 20; // 块作用域变量std::cout << "块变量: " << a << std::endl;}std::cout << "局部变量: " << a << std::endl;
}
int main() {func();std::cout << "全局变量: " << a << std::endl;return 0;
}输出结果:
块变量: 20
局部变量: 10
全局变量: 1
5.存储类的关键字
存储类主要的作用是在定义变量或函数的范围和生命周期。c++的程序中的存储类有:
(1)register
用于定义存储在寄存器而不是RAM中的变量,以便更快访问
(2)static
- 限制变量的作用域在当前文件中,该变量只能在定义他的文件中使用
- static声明完静态变量后,在程序的整个执行期间都会一直存在,即使超出的声明他的函数的作用域
(3) extern
用于声明其他文件中定义的全局变量,也就是在B文件中使用A文件声明的全局变量
6.字符串的使用
C++中,有很多用于操作字符串的函数,这里记录一下
在使用这些函数前,需声明一下:
#include <string>
函数 | 作用 |
---|---|
strcpy(s1,s2) | 复制字符串S2到S1中 |
strcat(s1,s2) | 将S2链接到S1的末尾 |
strlen(s1) | 返回字符串s1的长度 |
strcmp(s1,s2) | 判断字符串s1和s2是否相同,相同返回0,s1<s2返回值小于0,s1>s2返回值大于0 |
strchr(s1,ch) | 返回一个指针,指向ch第一次出现在字符串s1的位置 |
strstr(s1,s2) | 返回一个指针,指向字符串s1中,第一次出现字符串s2的位置 |
7. 引用
我在之前的学习引用的时候有一处一直搞不用,就是引用作为函数的参数,今天问了chatgpt一个问题后,豁然开朗
问题:void swap(int& x, int& y);和void swap(int x, int y)的区别
回答:
- 参数传递方式:第一个函数 void swap(int& x, int& y); 使用引用作为参数,而第二个函数 void swap(int x, int y); 使用值传递。
- 修改原变量:当调用 void swap(int& x, int& y); 函数时,函数内部可以直接修改传入的变量 x 和 y 的值。因为引用传递的是变量的地址,所以修改引用的值会影响到原变量。而当调用 void swap(int x, int y); 函数时,函数内部只能修改传入的副本变量 x 和 y 的值,不会影响原变量。
- 性能开销:使用引用传递可以避免对变量进行拷贝操作,提高代码的执行效率。而使用值传递需要进行值的拷贝,可能会产生较大的开销。
代码案例
- 函数使用引用
#include <iostream>
using namespace std;
int x = 10;
int y = 20;
void swap(int &x, int& y) {int temp = x;x = y;y = temp;
}
int main() {cout << "x:" << x << endl;cout << "y:" << y << endl;swap(x, y);cout << "new_x:" << x << endl;cout << "new_y:" << y << endl;
}
输出结果://x和y的值做了交换
x:10
y:20
new_x:20
new_y:10
- 函数不使用引用
#include <iostream>
using namespace std;
int x = 10;
int y = 20;
void swap(int x, int y) {int temp = x;x = y;y = temp;
}
int main() {cout << "x:" << x << endl;cout << "y:" << y << endl;swap(x, y);cout << "new_x:" << x << endl;cout << "new_y:" << y << endl;
}
输出结果://x和y的值没做交换
x:10
y:20
new_x:10
new_y:20
总结:也就是说,当你想值使用传入变量的值时,使用值传递即可。但是当你想要修改传入变量的值时,使用引用传递,同时如果传入的参数过大,避免拷贝占用内存,使用引用传递也是很好的。
8.结构
C++中用户可以自定义可用的数据类型,这个叫结构体。
定义结构,使用的是struct语句,其结构如下:
struct Books{
char title[50];
char author[50];
char subject[100];
int book_id;
} book;可以对结构体进行声明和赋值
Books Book1
strcpy(Book1.title,"C++教程");
Book1.bool_id = 1;
9.抽象类和纯虚函数
纯虚函数和抽象类之间是紧密关联的,抽象类是包含至少一个纯虚函数的类。纯虚函数没有具体的实现,只是提供了函数的接口。抽象类不能被实例化,只能用作其他类的基类来派生新的类。
抽象类是一种特殊的类,不能被实例化,实例化抽象类将会报错。
抽象类的定义:定义抽象类,需要抽象类中至少要有一个纯虚函数
纯虚函数的定义: 纯虚函数通过在函数末尾使用=0来定义 virtual void pureVirtualFunction() = 0;
一个纯虚函数的和抽象类的使用方法
class Base {
public:virtual void pureVirtualFunction() = 0; // 纯虚函数声明void normalFunction() {// 普通函数实现// ...}
};class Derived : public Base {
public:void pureVirtualFunction() override {// 派生类中重写纯虚函数,提供具体实现// ...}
};
10. 虚函数和纯虚函数的区别
虚函数 | 纯虚函数 | |
---|---|---|
声明 | 函数前要加virtual关键字 | 使用virtual 和“=0”声明 |
派生类中是否需要重写 | 随意 | 必须重写 |
11. 命名空间
当你自定义的函数如zzy(),与另外一个函数库也有一个zzy()函数,编译器就无法判断你使用的时哪一个zzy()函数
引入命名空间专门为了解决这个问题
定义命名空间
命名空间是需要定义的,这个目前我没有设计到,但其实就时把对应的函数放到命名空间这个大括号中即可
namespace namespace_name{
void func(){
具体函数实现
}
}
命名空间的使用
using namespace std; 这个是最常见的命名空间
如果不使用这个命令的话,很对c++的内置函数使用时就需要用“std::函数”的形式来使用
12.模板
13.lambda函数
lambda函数是在C++ 11中新增的功能,广泛定义于需要定义短小的函数对象、算法和容器操作
lambda的定义
[capture](parameters) -> return_type { body }auto sum = [](int a, int b) -> int {return a + b;};
capture 是一个可选的捕获列表,用于在lambda函数内部访问外部变量。parameters 是参数列表,用于传递给lambda函数的参数。return_type 是返回类型,指定lambda函数的返回值类型。body 是函数体,包含lambda函数的具体实现逻辑。
相关文章:
【番外篇】C++语法学习笔记
学习目标:C的一些高级操作 根据C菜鸟教程自学的笔记,大家有想学习C的话可以根据这个网站进行学习。这个推荐有一定基础的再去进行自学。新手的话还是建议直接看一些视频跟着学 学习内容: 1. 运算符重载 说到C中的运算符重载,首…...
js 字符串转数字
在 JavaScript 中,可以使用以下方法将字符串转换为数字: parseInt parseInt():将字符串转换为整数。它会从字符串的开头开始解析,直到遇到非数字字符为止。如果第一个字符不能转换为数字,则返回 NaN。 let str &qu…...

【NI-DAQmx入门】外部采样时钟相关
1.时钟的作用 时钟在几乎所有测量系统中都起着至关重要的作用。通过硬件定时测量,时钟控制采样或更新的发生时间。与依赖软件计时测量相比,您可以选择硬件定时测量来实现采样或更新之间更一致的时间间隔。以数模转换器特性分析为例。该应用由三个基本部分…...
Amazon EC2 Hpc7g 实例现已在更多区域推出
即日起,Amazon Elastic Compute Cloud (Amazon EC2) Hpc7g 实例将在亚太地区(东京)、欧洲地区(爱尔兰)和 Amazon GovCloud(美国西部)区域推出。Amazon EC2 Hpc7g 实例由 Amazon Graviton 处理器…...
【开题报告】基于SpringBoot的药店药品管理系统的设计与实现
1.研究背景 随着人们对健康的日益关注和医疗技术的不断进步,药店在人们生活中的重要性越来越凸显。药店承担着提供药品和健康咨询等服务的角色,而药品管理是药店运营的核心内容之一。传统的药店药品管理往往依赖人工操作,存在着信息不透明、…...
Promise用法详解
文章目录 一、异步代码的困境1.异步任务的处理 二、认识Promise作用1.什么是Promise呢?2.Promise的代码结构 三、Promise状态变化1.Executor2.resolve不同值的区别3.then方法 – 接受两个参数4.then方法 – 多次调用5.then方法 – 返回值6.catch方法 – 多次调用7.c…...

7.spark sql编程
概述 spark 版本为 3.2.4,注意 RDD 转 DataFrame 的代码出现的问题及解决方案 本文目标如下: RDD ,Datasets,DataFrames 之间的区别入门 SparkSession创建 DataFramesDataFrame 操作编程方式运行 sql 查询创建 DatasetsDataFrames 与 RDDs 互相转换 使用…...

【2023】COMAP美赛数模中的大型语言模型LLM和生成式人工智能工具的使用
COMAP比赛中的大型语言模型和生成式人工智能工具的使用 写在最前面GitHub Copilot工具 说明局限性 团队指南引文和引用说明人工智能使用报告 英文原版 Use of Large Language Models and Generative AI Tools in COMAP ContestslimitationsGuidance for teamsCitation and Refe…...
数据结构-顺序表学习资料
什么是顺序表? 顺序表是一种线性数据结构,它按照元素在内存中的物理顺序存储数据。顺序表可以通过数组实现,也可以通过链表和动态数组实现。 顺序表的特点 元素连续存储:顺序表中的元素在内存中是连续存储的,这样可…...

微信小程序获取剪切板的内容到输入框中
xml代码 <navigation-bar title"Weixin" back"{{false}}" color"black" background"#FFF"></navigation-bar> <view><input placeholder"请输入内容" name"content" type"text" …...

【年底不想背锅!网络工程师必收藏的排障命令大全】
网络故障排除工具是每个网络工程师的必需品。 为了提升我们的工作效率, 不浪费时间,工具的重要性显而易见 特别是每当添加新的设备或网络发生变更时,新的问题就会出现,而且很难快速确定问题出在哪里。每一位网络工程师或从事网…...
Windows服务器用PowerShell script判断服务器启动时间并做reboot动作
脚本如下,Windows 2019环境 60*119 是119分钟 $x(Get-Date) - (gcim Win32_OperatingSystem).LastBootUpTime echo $x.TotalSeconds " seconds passed" if($x.TotalSeconds -gt 60*119) {Invoke-Expression -Command "msg.exe * /TIME:20 reboot i…...

【HTML】播放器如何自动播放【已解决】
自动播放器策略 先了解浏览器的自动播放器策略 始终允许静音自动播放在以下情况,带声音的自动播放才会被允许 2.1 用户已经与当前域进行交互 2.2 在桌面上,用户的媒体参与指数阈值(MEI)已被越过,这意味着用户以前播放带有声音的视频。 2.3 …...

Go Gin中间件
Gin是一个用Go语言编写的Web框架,它提供了一种简单的方式来创建HTTP路由和处理HTTP请求。中间件是Gin框架中的一个重要概念,它可以用来处理HTTP请求和响应,或者在处理请求之前和之后执行一些操作。 以下是关于Gin中间件开发的一些基本信息&am…...

财务数字化转型的切入点是什么?_光点科技
随着科技的不断进步,数字化转型已经成为各个行业追求的目标,财务领域也不例外。那么,财务数字化转型的切入点在哪里呢?如何确保转型的成功进行? 数据整合与管理 财务数据的准确性与及时性是财务管理的基石。数字化转型…...

Langchain知识点(上)
输出格式 Pydantic (JSON) 解析器 # 创建模型实例 from langchain import OpenAI model OpenAI(model_nametext-davinci-003)# ------Part 2 # 创建一个空的DataFrame用于存储结果 import pandas as pd df pd.DataFrame(columns["flower_type", "price"…...

Tomcat安装配置教程
目录 1、安装tomcat1.1、查看JDK版本1.2、 匹配对应的JDK版本1.3、 下载Tomcat1.3.1、 安装包版(推荐,不用配环境)1.3.2、 压缩包版 2、 运行Tomcat3、 不能运行问题 1、安装tomcat 1.1、查看JDK版本 由于不同版本tomcat对于jdk的版本有要求…...

Python小试牛刀:GUI(图形界面)实现计算器UI界面(三)
上一篇:Python小试牛刀:GUI(图形界面)实现计算器UI界面(二)-CSDN博客 回顾前两篇文章,第一篇文章主要实现了计算器UI界面如何布局,以及简单概述Python常用的GUI库。第二篇文章主要实现了计算器UI界面按钮组…...

王道计算机网络
一、计算机网络概述 (一)计算机网络基本概念 计算机网络的定义、组成与功能 定义:以能够相互共享资源的方式互连起来的自治计算机系统的集合。 目的:资源共享, 组成单元:自治、互不影响的计算机 网络协议 从不同角度计算机网络…...

【漏洞复现】IIS_7.o7.5解析漏洞
感谢互联网提供分享知识与智慧,在法治的社会里,请遵守有关法律法规 文章目录 1.1、漏洞描述1.2、漏洞等级1.3、影响版本1.4、漏洞复现1、基础环境2、漏洞扫描3、漏洞验证 1.5、修复建议 1.1、漏洞描述 漏洞原理: cgi.fix_path1 1.png/.php该…...

springboot 百货中心供应链管理系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

NLP学习路线图(二十三):长短期记忆网络(LSTM)
在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...
【HTTP三个基础问题】
面试官您好!HTTP是超文本传输协议,是互联网上客户端和服务器之间传输超文本数据(比如文字、图片、音频、视频等)的核心协议,当前互联网应用最广泛的版本是HTTP1.1,它基于经典的C/S模型,也就是客…...
聊一聊接口测试的意义有哪些?
目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开,首…...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...
今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存
文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...
管理学院权限管理系统开发总结
文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...