【番外篇】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 = cyy
cyy看成了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

  1. 限制变量的作用域在当前文件中,该变量只能在定义他的文件中使用
  2. 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)的区别

回答:

  1. 参数传递方式:第一个函数 void swap(int& x, int& y); 使用引用作为参数,而第二个函数 void swap(int x, int y); 使用值传递。
  2. 修改原变量:当调用 void swap(int& x, int& y); 函数时,函数内部可以直接修改传入的变量 x 和 y 的值。因为引用传递的是变量的地址,所以修改引用的值会影响到原变量。而当调用 void swap(int x, int y); 函数时,函数内部只能修改传入的副本变量 x 和 y 的值,不会影响原变量。
  3. 性能开销:使用引用传递可以避免对变量进行拷贝操作,提高代码的执行效率。而使用值传递需要进行值的拷贝,可能会产生较大的开销。

代码案例

  1. 函数使用引用
#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
  1. 函数不使用引用
#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函数的具体实现逻辑。

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

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

相关文章

8年资深测试总结,接口自动化框架的设计与实现,一文打通...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、自动化测试框架…

Ionic 模块组件的理解

1 Ionic4.x 文件分析 1.1 app.module.ts 分析 Ionic 是一个基于 Angular 的移动应用开发框架&#xff0c;能帮助开发者使用 Web 技术&#xff08;HTML5、CSS3、JavaScript&#xff09;创建跨平台的应用程序。在 Ionic 应用程序中&#xff0c;app.module.ts 文件是整个应用程序的…

基于javaweb+mysql的jsp+servlet学生成绩管理系统(管理员、教师、学生)

博主24h在线&#xff0c;想要源码文档部署视频直接私聊&#xff0c;9.9元拿走&#xff01; 基于javawebmysql的jspservlet学生成绩管理系统(管理员、教师、学生)(javajspservletjavabeanmysqltomcat) 运行环境 Java≥8、MySQL≥5.7、Tomcat≥8 开发工具 eclipse/idea/myecl…

UE5 c++将自定义UserWdiget添加到对应菜单栏

前言&#xff1a; 为了实现与UserWidget一致的右键添加&#xff0c;便有了此章 注&#xff1a;这里使用的是UE5.3 目标内容&#xff1a; 这里可以参考UserWidget的源码&#xff0c;拷贝一份属于自己的就ok&#xff08;本篇章只是全改成了属于自己的CommonUserWidget&#xff…

Android 使用.9图 NinePatchDrawable实现动态聊天气泡

最近一段时间&#xff0c;在做一个需求&#xff0c;需要实现一个聊天气泡的动画效果&#xff0c;如下图所示&#xff1a; GitHub源码demo &#xff0c;建议下载demo&#xff0c;运行查看。 动态聊天气泡动画 静态聊天气泡 经过一段时间调研&#xff0c;实现方案如下: 实现方…

栈(定义,基本操作,顺序存储,链式存储)

目录 1.栈的定义1.重要术语2.特点 2.栈的基本操作3.栈的顺序存储1.顺序栈的定义2.基本操作1.初始化2.进栈3.出栈4.读栈顶 3.共享栈 4.栈的链式存储 1.栈的定义 栈( Stack&#xff09;是只允许在一端进行插入或删除操作的线性表。 一种受限的线性表&#xff0c;只能在栈顶进行插…

高校为什么需要大数据挖掘平台?

目前数据挖掘已经成为各种应用领域的重要技术&#xff0c;大学数据挖掘课程的开放已经出现。数据挖掘课程整合了多门学科知识。该课程包括各种理论知识&#xff0c;也离不开相关的实用技术。整个教学过程是培养和提高学生全面创新和解决问题的能力。过去&#xff0c;教学过程理…

Vscode禁止插件自动更新

由于电脑的vscode版本不是很新。2022.10月份的版本1.7.2&#xff0c;电脑vscode的python插件装的也是2022年4月份的某个版本&#xff0c;但插件经常自动更新&#xff0c;导致python代码无法Debug,解决办法&#xff1a; 点设置&#xff0c;搜autoUpdate, 把红色框选成无

MicroStation二次开发问题记录(1):打开项目时自动加载dll文件

环境配置 Windows10 MicroStation CE Update16 Visual Studio 2019 前言 开发好的dll文件若每次都需要在打开MS时单独加载&#xff0c;则过于繁琐&#xff0c;因此可以在确定的工程项目文件中进行一次设置&#xff0c;在打开该文件时自动加载 一、加载dll文件 1. 点击File—Se…

【模型推理优化学习笔记】CUDA加速矩阵乘计算

矩阵乘可以利用gpu多线程并行的特点进行加速计算&#xff0c;但是传统简单的方法需要多次读取数据到寄存器中&#xff0c;增加耗时&#xff0c;因此利用gpu的共享内存可以被一个block内的所有线程访问到的特性&#xff0c;结合tiling技术进行加速计算。 理论部分不解释了&#…

k8s ingress 代理 mysql 3306端口

helm 安装 ingress-nginx helm upgrade --install ingress-nginx ingress-nginx \--repo https://kubernetes.github.io/ingress-nginx \--namespace ingress-nginx --create-namespace执行命令 kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-ngin…

ROS学习笔记(5):ros_control

1.ros_control简介 ros_control - ROS Wiki ros_control是为ROS提供的机器人控制包&#xff0c;包含一系列控制器接口、传动装置接口、控制器工具箱等,有效帮助机器人应用功能包快速落地&#xff0c;提高开发效率。 2.ros_control框架 ros_control总体框架&#xff1a; 针对…

【微服务 Spring Cloud 6】服务如何拆分?使用微服务的注意事项?

目录 一、前言二、单体服务的弊端三、微服务化四、服务如何拆分&#xff1f;1、拆分原则2、拆分时机和拆分方法3、拆分实践 五、使用微服务的注意事项1、确保相关业务和利益相关者的支持2、确定微服务的拆分粒度3、遵循微服务架构的原则4、确保接口的稳定性5、关注数据一致性6、…

百数低代码与AI:实现业务智能化的新途径

今年6月&#xff0c;咨询机构麦肯锡发布了的一份题为《生成式人工智能的经济潜力》的研究报告&#xff0c;在报告中&#xff0c;分析师们通过对47个国家及地区的850种职业&#xff08;全球80%以上劳动人口&#xff09;的研究&#xff0c;探讨了在AI成指数级发展背后&#xff0c…

Shaderlab属性块

文档 官方文档 作用 参数显示在外部&#xff0c;可自定义调节。 语法 _Name(“Display Name”,type)defaultvalue _Name&#xff1a;必须使用下划线开始 Display Name:材质面板上显示的内容 type:属性的类型 dafaultvalue:类型的默认值 必须赋值 常用类型 Float:浮点数 …

PostgreSQL简介及安装步骤

PostgreSQL简介 PostgreSQL是一款开源的关系型数据库管理系统&#xff0c;具有强大的扩展性、高度的可定制性和可靠的稳定性&#xff0c;因此在企业级应用和开发领域中得到了广泛的应用。本文将介绍PostgreSQL的基本概念以及在各种操作系统上的安装步骤。 安装步骤 1. Window…

18、Flink的SQL 支持的操作和语法

Flink 系列文章 1、Flink 部署、概念介绍、source、transformation、sink使用示例、四大基石介绍和示例等系列综合文章链接 13、Flink 的table api与sql的基本概念、通用api介绍及入门示例 14、Flink 的table api与sql之数据类型: 内置数据类型以及它们的属性 15、Flink 的ta…

05【保姆级】-GO语言的标识符

之前我学过C、Java、Python语言时总结的经验&#xff1a; 先建立整体框架&#xff0c;然后再去抠细节。先Know how&#xff0c;然后know why。先做出来&#xff0c;然后再去一点点研究&#xff0c;才会事半功倍。适当的囫囵吞枣。因为死抠某个知识点很浪费时间的。对于GO语言&a…

vscode + cmake + opencv example

nice try on macos CMakeLists.txt cmake_minimum_required(VERSION 3.20) #添加OPENCV库 #指定OpenCV版本&#xff0c;代码如下 #find_package(OpenCV 3.3 REQUIRED) #如果不需要指定OpenCV版本&#xff0c;代码如下 find_package(OpenCV REQUIRED)#添加OpenCV头文件 includ…

智能语音和自然语言处理技术

一、定义 智能语音和自然语言处理技术是指通过计算机技术实现人机交互的一种技术。它可以让计算机和人类之间进行自然而流畅的交流&#xff0c;从而实现更高效、更便捷、更智能的信息交流和处理。 智能语音和自然语言处理技术主要包括语音识别、语音合成、自然语言理解、自然…