【番外篇】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该…...
Appium+python自动化(十六)- ADB命令
简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...
【大模型RAG】Docker 一键部署 Milvus 完整攻略
本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...
HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...
C++ 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
【HTTP三个基础问题】
面试官您好!HTTP是超文本传输协议,是互联网上客户端和服务器之间传输超文本数据(比如文字、图片、音频、视频等)的核心协议,当前互联网应用最广泛的版本是HTTP1.1,它基于经典的C/S模型,也就是客…...
Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)
在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马(服务器方面的)的原理,连接,以及各种木马及连接工具的分享 文件木马:https://w…...
Java数值运算常见陷阱与规避方法
整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...
Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)
引言 在人工智能飞速发展的今天,大语言模型(Large Language Models, LLMs)已成为技术领域的焦点。从智能写作到代码生成,LLM 的应用场景不断扩展,深刻改变了我们的工作和生活方式。然而,理解这些模型的内部…...
Git常用命令完全指南:从入门到精通
Git常用命令完全指南:从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...
