【C++】知识点汇总(上)
C++知识点复习上
- 一、C++ 概述
- 1. 基本数据类型
- 2. 变量定义和访问
- 3. 常量与约束访问
- 二、程序控制结构详解与示例
- 1. 表达式
- 2. 选择控制
- 2.1 if 语句
- 2.2 switch 语句
- 3. 循环控制
- 3.1 for 循环
- 3.2 while 循环
- 3.3 do-while 循环
- 4. goto 语句
- 5. 控制语句的嵌套
- 三、函数
- 1. 函数的定义和调用
- 2. 函数参数传递
- 3. 调用机制
- 4. 函数地址和指针
- 5. 内联与重载
- 6. 多文件程序和命名空间
- 四、数组和动态存储
- 1. 一维数组
- 2. 二维数组
- 3. 指针数组
- 4. 动态存储
- 5. Vector类
- 6. String类
- 7.比较
- 五、集合与结构
- 1. 位运算
- 1.1 与运算(AND)
- 1.2 或运算(OR)
- 1.3 异或运算(XOR)
- 2. 集合基本运算
- 2.1 并集
- 2.2 交集
- 2.3 差集
- 3. 结构的定义与访问
- 4. 结构数组和链表
- 4.1 结构数组
- 4.2 链表
一、C++ 概述
C++ 是一种强大且广泛使用的编程语言,它结合了 C 语言的高效性和面向对象编程的特性。本文将介绍 C++ 的一些基本概念,包括基本数据类型、变量定义和访问,以及常量与约束访问。通过实际例子和表格,将了解这些重要的概念。
1. 基本数据类型
在 C++ 中,基本数据类型是构建其他数据类型的基石。以下是一些常见的基本数据类型:
类型 | 描述 | 大小 |
---|---|---|
int | 整数类型 | 4 字节 |
float | 单精度浮点数 | 4 字节 |
double | 双精度浮点数 | 8 字节 |
char | 字符类型 | 1 字节 |
bool | 布尔类型 | 1 字节 |
2. 变量定义和访问
在 C++ 中,变量是用于存储数据值的标识符。以下是变量的定义和访问的示例:
// 变量定义
int age;
float height;// 变量赋值
age = 25;
height = 1.75;// 变量访问
cout << "年龄:" << age << " 岁" << endl;
cout << "身高:" << height << " 米" << endl;
3. 常量与约束访问
常量是在程序执行期间不能被修改的值,而约束访问则是通过修饰符确保函数中的某些行为。以下是常量和约束访问的例子:
// 常量定义
const float PI = 3.14159;
const int MAX_AGE = 100;// 约束访问
void printMessage(const string& message) {cout << message << endl;
}int main() {printMessage("Hello, C++!");return 0;
}
在上述示例中,PI
和 MAX_AGE
是常量,它们的值在程序运行期间不会改变。而 printMessage
函数中的 const string& message
表示 message
参数是一个常量引用,禁止在函数中修改传递的字符串。
二、程序控制结构详解与示例
程序控制结构是编程中至关重要的一部分,它决定了程序执行的流程和逻辑。接下来浅示七种表达式、两种选择控制、三种循环控制、goto
语句以及控制语句的嵌套。通过详细的例子和表格,将更好地理解这些控制结构的使用。
1. 表达式
表达式是编程语言中的基本构建块,它们用于执行特定的计算。以下是七种常见的表达式:
-
算术表达式: 执行基本的算术运算。
int result = 5 + 3 * 2;
-
关系表达式: 比较两个值之间的关系。
bool isEqual = (x == y);
-
逻辑表达式: 使用逻辑运算符组合多个条件。
boolean isTrue = (a && b) || (c || d);
-
赋值表达式: 将一个值赋给一个变量。
int a = 10;
-
条件表达式(三元运算符): 根据条件选择不同的值。
var result = (x > 0) ? "Positive" : "Negative";
-
位运算表达式: 对二进制位进行操作。
int result = a & b;
-
sizeof 表达式: 返回数据类型的大小。
size_t size = sizeof(int);
2. 选择控制
选择控制结构用于根据条件执行不同的代码块。
2.1 if 语句
if condition:# 如果条件成立执行此处代码
else:# 否则执行此处代码
示例:
int num = 5;
if (num % 2 == 0) {System.out.println("偶数");
} else {System.out.println("奇数");
}
2.2 switch 语句
switch (expression) {case value1:// 如果 expression 等于 value1 执行此处代码break;case value2:// 如果 expression 等于 value2 执行此处代码break;default:// 如果 expression 不等于任何一个 value 执行此处代码
}
示例:
char grade = 'B';
switch (grade) {case 'A':System.out.println("优秀");break;case 'B':System.out.println("良好");break;default:System.out.println("其他");
}
3. 循环控制
循环控制结构允许我们多次执行相同的代码块。
3.1 for 循环
for (initialization; condition; update) {// 循环体
}
示例:
for (int i = 1; i <= 5; i++) {Console.WriteLine(i);
}
3.2 while 循环
while (condition) {// 循环体
}
示例:
int count = 0;
while (count < 5) {print(count)count += 1
}
3.3 do-while 循环
do {// 循环体
} while (condition);
示例:
int i = 0;
do {console.log(i);i++;
} while (i < 5);
4. goto 语句
goto
语句允许直接跳转到程序中的标记位置。
if (condition) {goto label;
}// 其他代码label:
// 标记位置的代码
示例:
x = 0if x == 0:goto exit# 其他代码exit:
# 退出标记
5. 控制语句的嵌套
控制语句可以嵌套,形成复杂的逻辑结构。
示例:
for (int i = 0; i < 3; i++) {if (i == 0) {System.out.println("i 是 0");} else {System.out.println("i 不是 0");}
}
三、函数
当谈论C++编程时,函数是一个非常重要的概念。函数允许我们将代码组织成可重用的模块,提高代码的可读性和维护性。包括函数的定义和调用、函数参数传递、调用机制、函数地址和指针、内联与重载、以及多文件程序和命名空间。
1. 函数的定义和调用
在C++中,函数的定义包括函数名、返回类型、参数列表和函数体。下面是一个简单的例子:
// 函数的定义
int add(int a, int b) {return a + b;
}int main() {// 函数的调用int result = add(3, 5);return 0;
}
2. 函数参数传递
C++支持多种函数参数传递方式,包括值传递、引用传递和指针传递。看下面的例子:
// 值传递
void incrementByValue(int x) {x++;
}// 引用传递
void incrementByReference(int &x) {x++;
}// 指针传递
void incrementByPointer(int *x) {(*x)++;
}int main() {int num = 10;incrementByValue(num);// num的值不变incrementByReference(num);// num的值加1incrementByPointer(&num);// num的值再次加1return 0;
}
3. 调用机制
C++函数调用机制涉及栈和堆的管理,以及函数的入栈和出栈过程。这是一个复杂的话题,我们将简要介绍。函数的调用涉及以下步骤:
- 将参数推送到栈上
- 跳转到函数的地址
- 执行函数体
- 将结果返回给调用者
4. 函数地址和指针
在C++中,函数也有地址,可以通过函数指针来调用函数。下面是一个示例:
// 函数指针的声明
int (*addPointer)(int, int);// 函数指针的赋值
addPointer = &add;// 使用函数指针调用函数
int result = addPointer(3, 5);
5. 内联与重载
内联函数可以提高函数调用的效率,而函数重载允许我们定义多个同名函数,根据参数的类型和数量进行区分。看下面的例子:
// 内联函数
inline int multiply(int a, int b) {return a * b;
}// 函数重载
int add(int a, int b) {return a + b;
}double add(double a, double b) {return a + b;
}
6. 多文件程序和命名空间
在大型项目中,将代码分为多个文件是一种良好的实践。同时,命名空间可以避免命名冲突。示例如下:
文件1: math_functions.h
namespace Math {int add(int a, int b);double multiply(double a, double b);
}
文件2: math_functions.cpp
#include "math_functions.h"namespace Math {int add(int a, int b) {return a + b;}double multiply(double a, double b) {return a * b;}
}
文件3: main.cpp
#include "math_functions.h"int main() {int result = Math::add(3, 5);double product = Math::multiply(2.5, 4.0);return 0;
}
四、数组和动态存储
在编程中,数组是一种基本的数据结构,用于存储相同类型的元素。对于一维数组、二维数组、指针数组、动态存储以及C++中的vector和string类。将通过例子和表格演示它们的用法和区别。
1. 一维数组
一维数组是具有相同数据类型的元素的有序集合。声明和初始化一个一维整数数组的示例:
int arr[5] = {1, 2, 3, 4, 5};
2. 二维数组
二维数组是包含行和列的数组。下面是一个2x3的整数二维数组的声明和初始化:
int matrix[2][3] = {{1, 2, 3},{4, 5, 6}
};
3. 指针数组
指针数组是一个数组,其中的元素是指针。以下是一个包含指向整数的指针的数组的示例:
int a = 5, b = 10, c = 15;
int* ptrArr[3] = {&a, &b, &c};
4. 动态存储
动态存储允许在运行时分配内存。使用new
关键字在堆上动态分配内存:
int* dynamicArr = new int[5];
dynamicArr[0] = 10;
dynamicArr[1] = 20;
// ... 使用动态数组
delete[] dynamicArr; // 释放内存
5. Vector类
C++中的std::vector
是一个动态数组,可以自动调整大小。以下是一个使用vector的示例:
#include <vector>
std::vector<int> vec = {1, 2, 3, 4, 5};
vec.push_back(6); // 添加元素
6. String类
C++中的std::string
是处理字符串的类。以下是一个使用string的示例:
#include <string>
std::string str = "Hello, World!";
7.比较
在下表中,对这些数组和动态存储的不同方面进行了比较:
特性 | 一维数组 | 二维数组 | 指针数组 | 动态存储 | Vector类 | String类 |
---|---|---|---|---|---|---|
声明与初始化 | int arr[5]; | int matrix[2][3]; | int* ptrArr[3]; | int* dynamicArr = new int[5]; | std::vector vec; | std::string str; |
内存管理 | 栈 | 栈 | 栈 | 堆 | 动态增长 | 堆 |
大小可变性 | 静态 | 静态 | 静态 | 动态 | 动态 | 动态 |
五、集合与结构
集合与结构是两个基本而重要的概念。包括位运算、集合基本运算、结构的定义与访问,以及结构数组和链表的应用。通过例子和表格,将介绍这些概念。
1. 位运算
位运算是在二进制位上执行操作的一种技术。以下是一些常见的位运算操作:
1.1 与运算(AND)
int result = a & b; // 将a和b的每个对应位进行与运算
1.2 或运算(OR)
int result = a | b; // 将a和b的每个对应位进行或运算
1.3 异或运算(XOR)
int result = a ^ b; // 将a和b的每个对应位进行异或运算
2. 集合基本运算
集合是一个独特的数据结构,常用于存储不重复的元素。以下是一些集合的基本运算:
2.1 并集
set<int> unionSet = setA;
unionSet.insert(setB.begin(), setB.end());
2.2 交集
set<int> intersectionSet;
set_intersection(setA.begin(), setA.end(), setB.begin(), setB.end(), inserter(intersectionSet, intersectionSet.begin()));
2.3 差集
set<int> differenceSet;
set_difference(setA.begin(), setA.end(), setB.begin(), setB.end(), inserter(differenceSet, differenceSet.begin()));
3. 结构的定义与访问
结构是一种用户自定义的数据类型,可以包含不同类型的数据。以下是结构的定义和访问:
struct Point {int x;int y;
};Point p1;
p1.x = 10;
p1.y = 20;
4. 结构数组和链表
4.1 结构数组
结构数组是一组相同类型的结构的集合。以下是一个点的结构数组的例子:
Point pointsArray[5];
pointsArray[0].x = 1;
pointsArray[0].y = 2;
// 其他元素的赋值类似
4.2 链表
链表是一种动态数据结构,它可以动态增长和缩小。以下是一个简单链表的例子:
struct Node {int data;Node* next;
};Node* head = new Node();
head->data = 1;
head->next = new Node();
head->next->data = 2;
head->next->next = nullptr;
相关文章:
【C++】知识点汇总(上)
C知识点复习上 一、C 概述1. 基本数据类型2. 变量定义和访问3. 常量与约束访问 二、程序控制结构详解与示例1. 表达式2. 选择控制2.1 if 语句2.2 switch 语句 3. 循环控制3.1 for 循环3.2 while 循环3.3 do-while 循环 4. goto 语句5. 控制语句的嵌套 三、函数1. 函数的定义和调…...
解决docker容器内无法连接宿主redis
背景 小程序的发短信服务挂了,随查看日志,该报错日志如下 Error 111 connecting to 127.0.0.1:6379. Connection refused. 6379是监听redis服务的端口,那大概是redis出错了。 首先查看了redis是否正常启动,检查出服务正常。 由于小…...
43 tmpfs/devtmpfs 文件系统
前言 在 linux 中常见的文件系统 有很多, 如下 基于磁盘的文件系统, ext2, ext3, ext4, xfs, btrfs, jfs, ntfs 内存文件系统, procfs, sysfs, tmpfs, squashfs, debugfs 闪存文件系统, ubifs, jffs2, yaffs 文件系统这一套体系在 linux 有一层 vfs 抽象, 用户程序不用…...
C语言编译器(C语言编程软件)完全攻略(第十二部分:VS2010下载地址和安装教程(图解))
介绍常用C语言编译器的安装、配置和使用。 十二、VS2010下载地址和安装教程(图解) 为了更好地支持 Win7 程序的开发,微软于2010年4月12日发布了 VS2010,它的界面被重新设计,变得更加简洁。需要注意的是,V…...
【VRTK】【VR开发】【Unity】18-VRTK与Unity UI控制的融合使用
课程配套学习项目源码资源下载 https://download.csdn.net/download/weixin_41697242/88485426?spm=1001.2014.3001.5503 【背景】 VRTK和Unity自身的UI控制包可以配合使用发挥效果。本篇就讨论这方面的实战内容。 之前可以互动的立体UI并不是传统的2D UI对象,在实际使用中…...
BERT(从理论到实践): Bidirectional Encoder Representations from Transformers【3】
这是本系列文章中的第3弹,请确保你已经读过并了解之前文章所讲的内容,因为对于已经解释过的概念或API,本文不会再赘述。 本文要利用BERT实现一个“垃圾邮件分类”的任务,这也是NLP中一个很常见的任务:Text Classification。我们的实验环境仍然是Python3+Tensorflow/Keras…...
静态网页设计——校园官网(HTML+CSS+JavaScript)
前言 声明:该文章只是做技术分享,若侵权请联系我删除。!! 使用技术:HTMLCSSJS 主要内容:对学校官网的结构进行模仿,对布局进行模仿。 主要内容 1、首页 首页以多个div对页面进行分割和布局…...
phpstudy_pro 关于多版本php的问题
我在phpstudy中安装了多个PHP版本 我希望不同的网站可以对应不同的PHP版本,则在nginx配置文件中需要知道不同的PHP版本的监听端口是多少,如下图所示 然而找遍了php.ini配置,并未对listen进行设置,好奇是怎么实现不同的PHP监听不同…...
TemporalKit的纯手动安装
最近在用本地SD安装temporalkit插件 本地安装插件最常见的问题就是,GitCommandError:… 原因就是,没有科学上网,而且即使搭了ladder,在SD的“从网址上安装”或是“插件安装”都不行,都不行!!&am…...
人生重开模拟器
前言: 人生重开模拟器是前段时间非常火的一个小游戏,接下来我们将一起学习使用c语言写一个简易版的人生重开模拟器。 网页版游戏: 人生重开模拟器 (ytecn.com) 1.实现一个简化版的人生重开模拟器 (1) 游戏开始的时…...
优化算法3D可视化
编程实现优化算法,并3D可视化 1. 函数3D可视化 分别画出 和 的3D图 import numpy as np from matplotlib import pyplot as plt import torch# 画出x**2 class Op(object):def __init__(self):passdef __call__(self, inputs):return self.forward(inputs)def for…...
魔术表演Scratch-第14届蓝桥杯Scratch省赛真题第1题
1.魔术表演(20分) 评判标准: 4分:满足"具体要求"中的1); 8分:满足"具体要求"中的2); 8分,满足"具体要求"中的3)…...
LLM 中的长文本问题
近期,随着大模型技术的发展,长文本问题逐渐成为热门且关键的问题,不妨简单梳理一下近期出现的典型的长文本模型: 10 月上旬,Moonshot AI 的 Kimi Chat 问世,这是首个支持 20 万汉字输入的智能助手产品; 10 月下旬,百川智能发布 Baichuan2-192K 长窗口大模型,相当于一次…...
深入了解Swagger注解:@ApiModel和@ApiModelProperty实用指南
在现代软件开发中,提供清晰全面的 API 文档 至关重要。ApiModel 和 ApiModelProperty 这样的代码注解在此方面表现出色,通过增强模型及其属性的元数据来丰富文档内容。它们的主要功能是为这些元素命名和描述,使生成的 API 文档更加明确。 Api…...
Linux学习第48天:Linux USB驱动试验:保持热情,保持节奏,持续学习是作为一个技术人员应有的基本素质和要求
Linux版本号4.1.15 芯片I.MX6ULL 大叔学Linux 品人间百味 思文短情长 最近更新的速度和频率大不如以前,主要原因还是自己有些懈怠了。学习是一个持续努力的过程,一旦中断,再想保持以往的状态可能要…...
数据库索引简析
文章目录 前言一、索引是什么二、索引的有什么用三、索引的分类四、索引的数据结构总结 前言 在我们使用数据库的过程中,往往会碰到一个叫做索引的东西,不管是表的设计,还是数据库性能的优化往往都会涉及到索引。那么他是个什么东西ÿ…...
leetcode贪心(单调递增的数字、监控二叉树)
738.单调递增的数字 给定一个非负整数 N,找出小于或等于 N 的最大的整数,同时这个整数需要满足其各个位数上的数字是单调递增。 (当且仅当每个相邻位数上的数字 x 和 y 满足 x < y 时,我们称这个整数是单调递增的。ÿ…...
如何在win7同样支持Webview2 在 WPF 中使用本地 Webview2 ,如何不依赖系统 Runtime
项目运行环境: .Net Framework 4.5.2 Windows 7 x64 Service Pack 1 WebView2 Microsoft.WebView2.FixedVersionRuntime.120.0.2210.91.x64 考虑到很多老项目,本项目使用的是.Net Framework 4.5.2,.Net 更高版本的其实也是可以支持的。 …...
【docker】网络模式管理
目录 一、Docker网络实现原理 二、Docker的网络模式 1、host模式 1.1 host模式原理 1.2 host模式实操 2、Container模式 2.2 container模式实操 3、none模式 4、bridger模式 4.1 bridge模式的原理 4.2 bridge实操 5、overlay模式 6、自定义网络模式 6.1 为什么需要…...
LiveGBS国标GB/T28181流媒体平台功能-国标级联中作为下级平台对接海康大华宇视华为政务公安内网等GB28181国标平台查看级联状态及会话
LiveGBS国标级联中作为下级平台对接海康大华宇视华为政务公安内网等GB28181国标平台查看级联状态及会话 1、GB/T28181级联是什么2、搭建GB28181国标流媒体平台3、获取上级平台接入信息3.1、如何提供信息给上级3.2、上级国标平台如何添加下级域3.2、接入LiveGBS示例 4、配置国标…...
技术发展驱动编程语言走向
未来编程语言的走向可能会受到多种因素的影响,包括技术进步、市场需求、开发人员的偏好和生态系统的演变等。以下是一些可能的发展趋势: 简洁性和易用性 随着技术的进步,编程语言可能会变得越来越简洁和易于使用。一些语言可能会引入更高级的…...
tp5+workman(GatewayWorker) 安装及使用
一、安装thinkphp5 1、宝塔删除php禁用函数putenv、pcntl_signal_dispatch、pcntl_wai、pcntl_signal、pcntl_alarm、pcntl_fork,执行安装命令。 composer create-project topthink/think5.0.* tp5 --prefer-dist 2、配置好站点之后,浏览器打开访问成…...
vscode安装Prettier插件,对vue3项目进行格式化
之前vscode因为安装了Vue Language Features (Volar)插件,导致Prettier格式化失效,今天有空,又重新设置了一下 1. 插件要先安装上 2. 打开settings.json {"editor.defaultFormatter": "esbenp.prettier-vscode","…...
macOS跨进程通信: XPC 创建实例
一:简介 XPC 是 macOS 里苹果官方比较推荐和安全的的进程间通信机制。 集成流程简单,但是比较绕。 主要需要集成 XPC Server 这个模块,这个模块最终会被 apple 的根进程 launchd 管理和以独立进程的方法唤起和关闭, 我们主app 进…...
Ubuntu18.04 升级Ubuntu20.04
文章目录 背景升级方法遇到的问题 背景 因项目环境需要,欲将Ubuntu18.04升级至Ubuntu20.04,参考网上其他小伙伴的方法,也遇到了一个问题,特此记录一下,希望能帮助其他有同样问题的小伙伴。 升级方法 参考:…...
自动化测试怎么做?看完你就懂了。。。
前言 我想应该有很多测试人员应该有这样的疑虑,自动化测试要怎么去做,现在我把自己的一些学习经验分享给大家,希望对你们有帮助,有说的不好的地方,还请多多指教! 对于测试人员来说,不管进行功…...
小秋SLAM入门实战opencv所有文章汇总
opencv_core和 opencv_imgcodecs是 OpenCV(开源计算机视觉库)的两个主要模块 【如何使用cv::erode()函数对图像进行腐蚀操作】 头文件用途 用OpenCV创建一张类型为CV_8UC1的单通道随机灰度图像 用OpenCV创建一张灰度黑色图像并设置某一列为白色 OpenCV创…...
2023年终总结(脚踏实地,仰望星空)
回忆录 2023年,经历非常多的大事情,找工作、实习、研究生毕业、堂哥结婚、大姐买车、申博、读博、参加马拉松,有幸这一年全家人平平安安,在稳步前进。算是折腾的一年,杭州、赣州、武汉、澳门、珠海、遵义来回跑。完成…...
Transforer逐模块讲解
本文将按照transformer的结构图依次对各个模块进行讲解: 可以看一下模型的大致结构:主要有encode和decode两大部分组成,数据经过词embedding以及位置embedding得到encode的时输入数据 输入部分 embedding就是从原始数据中提取出单词或位置&…...
macOS进程间通信的常用技术汇总
macOS进程间通信的常用技术汇总 命令行传参。yyds管道(pipe), 匿名管道, c的技术,可以跨平台使用 只能在父子进程间通信,由于是单向的管道,只能单方面传输数据。 如果需要双向传输,需要建立双向的两条管道才行 匿名管…...
php网站开发做什么/下载一个百度时事新闻
第一道整体二分,因为只需要知道每个询问区间中比mid大的数有多少个,就可以直接用线段树区间加,区间求和了。 1 #include<iostream>2 #include<cstdio>3 #include<cstring>4 #include<algorithm>5 #define int long l…...
专业做足球体彩网站/seo信息网
这篇文章的适用范围其实不仅限于Java后端或Java Web,不过其中有些是拿这方面举例的,在其它方面,大家可以举一反三,应该也能得到些启示。 我们在面试时,会发现有些候选人技术不错,比如在Java Web后端方面&am…...
淘宝网站是谁做的好/搜索引擎优化的各种方法
Pytorch框架学习记录9——非线性激活 1. ReLU函数介绍 torch.nn.ReLU(inplaceFalse) 参数 inplace- 可以选择就地执行操作。默认:False 形状: 输入:( * ), 在哪里**表示任意数量的维度。输出:( * ),与输入…...
沈阳网络建网站/西安seo教程
对于海量数据的插入和更新,ADO.NET确实不如JDBC做到好,JDBC有统一的模型来进行批操作.使用起来非常方便: PreparedStatement ps conn.prepareStatement("insert or update arg1,args2...."); 然后你就可以 for(int i0;i<1000000000000000;i){ ps.setXXX(realArg…...
网站建设太金手指六六六/网络营销百度百科
//检测 window 中新增的对象 //first var oldMap {}; for(var i in window) {oldMap[i] 1; }//second for(var i in window) {if(oldMap[i]) continue;alert(i); }$()选择器获取到的既不是一个dom元素,也不是节点列表,而是一个新的对象$() 不传入任何参…...
b2b网站发布信息平台/什么网站做推广比较好
上一节我们准备好了 macvlan 的实验环境,今天在 host1 和 host2 中创建 macvlan 网络 mac_net1: 注意:在 host2 中也要执行相同的命令。 ① -d macvlan 指定 driver 为 macvlan。 ② macvlan 网络是 local 网络,为了保证跨主机能…...