【C++基础知识详细记录】
一、基础知识
C++基础知识点的汇总涵盖了许多方面,包括但不限于以下内容:
1. 常量定义
-
使用
#define
宏定义常量:#define PI 3.14159265358979323846 // 宏定义一个浮点型常量PI
-
使用
const
关键字定义常量:const int MAX_SIZE = 100; // 常量MAX_SIZE不可修改 const double PI = 3.14159265358979323846;
2. 关键字
- C++中有特定的关键字,如
int
、double
、void
、if
、else
、for
、while
、switch
、case
、default
、class
、struct
、namespace
、const
、static
等,它们在程序中有特殊的含义和用途。
3. 标识符命名规则
-
标识符是用来给变量、函数、类等命名的。
-
规则包括:
- 必须以字母或下划线(_)开头。
- 后续字符可以是字母、数字或下划线。
- 关键字不能作为标识符使用。
- C++中标识符区分大小写。
4. 变量声明与定义
-
变量可以在需要时定义,并且可以指定初始值。
int age = 25; // 定义并初始化一个整型变量age
5. 数据类型
- C++支持多种数据类型,包括基本类型(如int, char, float, double)、枚举类型、指针类型以及用户自定义类型(通过结构体、联合体和类实现)。
6. 控制结构
-
条件语句:
if (age >= 18) {cout << "Adult"; } else {cout << "Minor"; }
-
循环语句:
for (int i = 0; i < 10; ++i) {cout << i << " "; } while (condition) {// 循环体 }
7. 函数
-
函数定义和调用:
// 函数定义 int add(int a, int b) {return a + b; }// 函数调用 int result = add(3, 5);
8. 数组和字符串
-
数组声明和使用:
int numbers[5] = {1, 2, 3, 4, 5};
-
字符串通常通过
std::string
来处理:std::string name = "John Doe";
9. 指针与引用
-
指针示例:
int value = 10; int* ptr = &value; // 指针ptr指向变量value *ptr = 20; // 通过指针修改值
-
引用示例:
int num = 15; int& ref = num; // 引用ref绑定到num ref = 30; // 通过引用修改num的值
10. 命名空间
-
命名空间用于避免标识符冲突:
namespace MyNamespace {int func() {return 42;} } using namespace MyNamespace; // 引入整个命名空间 // 或者 MyNamespace::func(); // 显式指定命名空间
11. 面向对象编程
-
类定义:
class Animal { public:Animal(const std::string& name) : name_(name) {}void speak() const {cout << "Animal speaks!" << endl;} private:std::string name_; };int main() {Animal dog("Rex");dog.speak();return 0; }
二、 进阶
当然,以下是这些C++高级概念的详细说明以及代码示例:
1. 模板(Templates)
说明:模板允许你定义泛型类或函数,即适用于多种数据类型的类和函数。它们在编译时进行实例化,生成具体的数据类型版本。
代码示例:
// 函数模板
template <typename T>
T max(T a, T b) {return (a > b) ? a : b;
}int main() {cout << max<int>(5, 10) << endl; // 直接指定类型为intcout << max(3.14, 2.71) << endl; // 编译器自动推断为double类型
}// 类模板
template <typename T>
class Stack {
public:void push(T item) { ... }T pop() { ... }
private:std::vector<T> data;
};int main() {Stack<int> intStack;intStack.push(10);Stack<std::string> strStack;strStack.push("Hello");
}
2. 异常处理
说明:C++提供了一种结构化的错误处理机制,通过try
、catch
和throw
关键字来捕获和抛出异常。
代码示例:
#include <stdexcept>void divide(int a, int b) {if (b == 0) {throw std::invalid_argument("Divisor cannot be zero!"); // 抛出异常}int result = a / b;// ...
}int main() {try {divide(10, 0); // 可能引发异常的操作} catch (const std::invalid_argument& e) {std::cerr << "Caught exception: " << e.what() << '\n';}return 0;
}
3. STL容器
说明:标准模板库(STL)提供了多种容器,如std::vector
、std::list
、std::map
等,用于存储和管理数据。
代码示例:
#include <vector>
#include <list>
#include <map>int main() {// 容器使用示例std::vector<int> vec{1, 2, 3, 4, 5}; // 动态数组std::list<int> lst{6, 7, 8, 9, 10}; // 双向链表std::map<std::string, int> m{{"apple", 1}, {"banana", 2}}; // 关联容器(键值对)vec.push_back(6);lst.push_back(11);for (const auto& item : vec) {std::cout << item << ' ';}std::cout << '\n';return 0;
}// 使用迭代器访问容器元素
for (auto it = vec.begin(); it != vec.end(); ++it) {std::cout << *it << ' '; // 输出vector中的每个元素
}
4. 迭代器(Iterators)
说明:迭代器是访问容器内元素的一种通用接口,就像指针一样可以遍历容器内的元素。
代码示例:
std::vector<int> numbers = {1, 2, 3, 4, 5};
for (std::vector<int>::iterator it = numbers.begin(); it != numbers.end(); ++it) {std::cout << *it << ' ';
} // 输出1 2 3 4 5// C++11之后推荐使用范围基础迭代器语法
for (auto it : numbers) {std::cout << it << ' ';
}
5. 智能指针(Smart Pointers)
说明:智能指针是一种对象,它存储指向动态分配的对象的指针,并在其生命周期结束时自动释放该对象,避免内存泄漏。常见的智能指针有std::unique_ptr
、std::shared_ptr
和std::weak_ptr
。
代码示例:
#include <memory>class MyClass {
public:MyClass() { /* 构造函数 */ }~MyClass() { /* 析构函数 */ }
};int main() {// unique_ptr 示例std::unique_ptr<MyClass> uptr(new MyClass());// 当uptr超出作用域时,其内部的MyClass对象会被自动删除// shared_ptr 示例std::shared_ptr<MyClass> sptr(new MyClass());// 多个shared_ptr可以共享同一个对象,所有shared_ptr销毁后才释放对象return 0;
}
6. RAII(Resource Acquisition Is Initialization)原则
说明:RAII是一种编程技术,资源获取时机与初始化同步,确保了资源的生命周期与对应的对象绑定在一起,使得资源在对象析构时自动释放。例如,智能指针就是RAII的一个典型应用。
7. 多态性(Polymorphism)
说明:多态性允许不同类的对象响应相同的调用请求,实现不同的行为。主要通过虚函数(virtual functions)和抽象基类(abstract base classes)实现。
代码示例:
class Animal {
public:virtual void speak() const = 0; // 纯虚函数,声明一个抽象基类
};class Dog : public Animal {
public:void speak() const override {std::cout << "Woof!" << std::endl;}
};class Cat : public Animal {
public:void speak() const override {std::cout << "Meow!" << std::endl;}
};int main() {Animal* dog = new Dog();Animal* cat = new Cat();dog->speak(); // 输出"Woof!"cat->speak(); // 输出"Meow!"delete dog;delete cat;return 0;
}
相关文章:
【C++基础知识详细记录】
一、基础知识 C基础知识点的汇总涵盖了许多方面,包括但不限于以下内容: 1. 常量定义 使用#define宏定义常量: #define PI 3.14159265358979323846 // 宏定义一个浮点型常量PI使用const关键字定义常量: const int MAX_SIZE 100;…...

Socket网络编程(五)——TCP数据发送与接收并行
目录 主要实现需求TCP 服务端收发并行重构启动main方法重构重构分离收发消息的操作重构接收消息的操作重构发送消息TCPServer调用发送消息的逻辑监听客户端链接逻辑重构Socket、流的退出与关闭 TCP 客户端收发并行重构客户端 main函数重构客户端接收消息重构客户端发送消息重构…...
2024最新-ubuntu22.04安装最新版QT6.6~6.8教程
1. 在官网下载 online_installer: https://download.qt.io/archive/online_installers/4.7/qt-unified-linux-x64-4.7.0-online.run 或者直接镜像站下载: http://mirrors.ustc.edu.cn/qtproject/archive/online_installers/4.7/qt-unified-linux-x6…...

STM32------分析GPIO寄存器
一、初始LED原理图 共阴极led LED发光二极管,需要有电流通过才能点亮,当有电压差就会产生电流 二极管两端的电压差超过2.7v就会有电流通过 电阻的作用 由于公式IV/R 不加电阻容易造成瞬间电流无穷大 发光二极管工作电流为10-20MA 3.3v / 1kΩ 3.…...
数学实验-Matlab使用(1)
使用方法以及笔记均在文件中 class1_func1.m function f class1_func1(x) % f为输出,输出有多个时需要用中括号以矩阵的方式包起来 % x为输入f sin(x)class1_func2.m function [a,b,u,v] class1_func2(x,y)[a,b] eig(x)[u,v] eig(y)class1.m % 当语句后有…...

kafka文件存储机制和消费者
1.broker文件存储机制 去查看真正的存储文件: 在/opt/module/kafka/datas/ 路径下 kafka-run-class.sh kafka.tools.DumpLogSegments --files ./00000000000000000000.index 如果是6415那么这个会存储在563的log文件之中,因为介于6410和10090之间。 2.…...

《汇编语言》- 读书笔记 - 第15章-外中断
《汇编语言》- 读书笔记 - 第15章-外中断 15.1 接口芯片和端口15.2 外中断信息1. 可屏蔽中断(Maskable Interrupt)2. 不可屏蔽中断(Non-Maskable Interrupt)设计思想 15.3 PC 机键盘的处理过程1. 键盘输入2. 引发 9 号中断3. 执行…...

【Vue3】CSS 新特性
:slotted <template> <!-- App.vue--><Son ><div class"a">我要插入了</div></Son> </template><script setup lang"ts"> import Son from ./components/Son.vue </script><style></sty…...

四信水电站泄洪预警方案,精准提升防汛应急水平
2022年5月水利部办公厅发布《关于开展水库泄洪设施专项排查整改的紧急通知》,为坚决贯彻落实关于水库大坝安全的重要指示批示精神、关于保障水库泄洪通道通畅的批示要求,全力防范水库可能出现的重大险情,确保水库安全度汛。 2023年3月国家能源…...

k8s中容器的调度与创建:CRI,cgroup
container调度与创建 选自:K8s、CRI与container - packy的文章 - 知乎 https://zhuanlan.zhihu.com/p/102897620 Cgroup创建: cgexec -g cpu,memory:$UUID \ > unshare -uinpUrf --mount-proc \ > sh -c "/bin/hostname $UUID &…...

Unity安装与简单设置
安装网址:https://unity.cn 设置语言: 设置安装位置:否则C盘就会爆了 获取一个个人的资格证: 开始安装: 安装完毕。 添加模块:例如简体中文 新建项目: 布局2*3、单栏布局、 设置…...

数据库的介绍、分类、作用和特点
数据库是用来存储、管理和检索数据的集合系统。根据数据处理模型的不同,数据库可以分为多种类型,主要包括: 1、关系型数据库(RDBMS): 介绍:关系型数据库使用表格形式来存储数据,并通…...

【Unity】机器人末端执行器仿真
机械手臂的末端执行器使用多项式来计算转动角度可能有几个原因: 精确控制:机械臂的运动通常需要高度的精确性,特别是在精密工作或复杂运动轨迹的情况下。多项式,特别是高阶的,可以很好地近似复杂的非线性关系和运动轨迹…...

更换个人开发环境后,pycharm连接服务器报错Authentication failed
原因:服务器中更换个人开发环境后,密码变了。 解决:在pycharm中修改服务器开发环境密码即可。 1 找到Tools-Depolyment-Configuration 2 点击SSH Configuration后的省略号 3 修改这里面的Password即可...
E - Bad Juice
解题思路 由于最后返回一个01字符串表示所选人的状态要求人数最少,即字符串长度最少而要用最少的字符,找出则返回的字符为二进制下的编号这样利用了所有的01字符号人表示二进制下位的情况注意对于2的次方项,只需要有位,可以用位均…...

用HTML5的<canvas>元素实现刮刮乐游戏
用HTML5的<canvas>元素实现刮刮乐游戏 用HTML5的<canvas>元素实现刮刮乐,要求:将上面的“图层”的图像可用鼠标刮去,露出下面的“图层”的图像。 示例从简单到复杂。 简单示例 准备两张图像,我这…...
TypeScript + react 中 TypeScript 的加入后 , 有哪些优化项目
在使用 TypeScript 结合 React 进行开发时,TypeScript 提供了许多优化和增强代码质量的方式。以下是一些关键的优化操作和最佳实践: 强类型组件属性(Props)和状态(State): 使用接口或类型别名定义组件的 pr…...
Redis学习路径(构建体系)
学习路径 掌握数据类型(分析底层数据结构)和缓存的基本使用 (理论使用) 掌握 redis 实现高性能,高可靠、高可用技术 (理论)学习redis源代码底层实现 (底层实现) 先来一个引言,比较宏观的角度…...

【README 小技巧】 展示gitee中开源项目start
【README 小技巧】 展示gitee中开源项目start <a target"_blank" hrefhttps://gitee.com/wujiawei1207537021/wu-framework-parent><img srchttps://gitee.com/wujiawei1207537021/wu-framework-parent/badge/star.svg altGitee star/></a>...
tcping实用小工具
Tcping实用小工具命令详解 一、tcping介绍 tcping:tcping命令基于tcp协议监控,可以从较低级别的协议获得简单的,可能不可靠的数据报服务。 原则上,TCP应该能够在从容硬线连接到分组交换或电路交换网络的各种通信系统之上操作。 …...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...

React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...

ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...
Golang dig框架与GraphQL的完美结合
将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...
基于数字孪生的水厂可视化平台建设:架构与实践
分享大纲: 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年,数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段,基于数字孪生的水厂可视化平台的…...
CMake控制VS2022项目文件分组
我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...
今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存
文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...
稳定币的深度剖析与展望
一、引言 在当今数字化浪潮席卷全球的时代,加密货币作为一种新兴的金融现象,正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而,加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下,稳定…...

WPF八大法则:告别模态窗口卡顿
⚙️ 核心问题:阻塞式模态窗口的缺陷 原始代码中ShowDialog()会阻塞UI线程,导致后续逻辑无法执行: var result modalWindow.ShowDialog(); // 线程阻塞 ProcessResult(result); // 必须等待窗口关闭根本问题:…...