C++基础精讲-01
1C++概述
1.1初识C++
发展历程:
C++ 由本贾尼・斯特劳斯特卢普在 20 世纪 70 年代开发,它在 C 语言的基础上增加了面向对象编程的特性,最初被称为 “C with Classes”,后来逐渐发展成为独立的 C++ 语言。
语言特点
(1)高效性:C++ 允许直接操作计算机硬件,能够对内存进行精细的管理,具有很高的执行效率,适用于开发对性能要求极高的程序,如游戏、操作系统、嵌入式系统等。
(2)面向对象:支持面向对象编程,将数据和操作数据的方法封装在类中,通过继承和多态性实现代码的复用和扩展,使程序结构更加清晰、易于维护。
(3)兼容性:与 C 语言保持了高度的兼容性,使得 C++ 可以直接使用大量现有的 C 语言代码和库,同时还能享受到 C++ 面向对象和高级特性带来的便利。
(4)丰富的库:拥有标准模板库(STL)等丰富的库,提供了各种常用的数据结构(如向量、链表、映射等)和算法(如排序、搜索等),大大提高了开发效率。
应用领域
C++ 应用广泛,除了上述提到的游戏开发、操作系统和嵌入式系统外,还用于图形图像、数据库管理、网络编程、金融计算等领域。
C和C++的关系
C++ 是 C 语言的超集,它继承了 C 语言的优点,同时又进行了扩展和改进。
g++编译器的下载
g++编译器是用来编译C++的;
sudo apt update
sudo apt install g++
第一个C++程序
#include<iostream> // 包含输入输出流库,使得程序可以使用标准输入输出功能,如 cout 和 cin
using namespace std; // 使用标准命名空间,这样在使用标准库中的对象和函数时就不需要加 std:: 前缀int main(int argc, char* argv[]) // 主函数,程序的入口点,argc 表示命令行参数的数量,argv 是一个指向命令行参数的字符指针数组
{cout << "hello world" << endl; // 输出字符串 "hello world" 到标准输出(通常是控制台),endl 表示换行return 0; // 主函数返回 0,表示程序正常结束
}
2.命名空间
2.1命名空间的概述
1.什么是实体?
变量、常量、函数、结构体、引用、类、对象、模板、命名空间等,它们都称为实体
2.什么是命名空间?
命名空间又称为名字空间,是程序员命名的内存区域,程序员根据需要指定一些有名字的空间域,把一些全局实体分别存放到各个命名空间中,从而与其他全局实体分隔开
比如c++中的输入输出cin和cout就在std标准命名空间中定义;
3.为什么要使用命名空间?
大型工程常由多人分工完成,不同人设计不同头文件,这可能导致不同头文件中类或函数命名相同,引发名字冲突。C++为解决该问题引入命名空间,它是用户自定义的作用域,在不同作用域可定义同名变量且互不干扰,系统能进行区分。
4.命名空间的基本格式
namespace 名
namespace A
{int a=10;......}
2.1命名空间基本使用
1.作用域限定符::
每次要使用某个命名空间中的实体时,都直接加上作用域限定符::
#include<iostream> // 引入输入输出流库,用于使用 cout 和 endl 进行输出操作// 定义命名空间 A
namespace A {int a = 10; // 在命名空间 A 中定义一个整型变量 a 并初始化为 10void fun1(void) { // 在命名空间 A 中定义一个无返回值、无参数的函数 fun1std::cout << "a=" << a << std::endl; // 输出命名空间 A 中变量 a 的值,并换行}
}// 定义一个无返回值、无参数的函数 test1
void test1(void) {A::fun1(); // 调用命名空间 A 中的 fun1 函数,输出 a 的初始值A::a = 100; // 修改命名空间 A 中变量 a 的值为 100A::fun1(); // 再次调用命名空间 A 中的 fun1 函数,输出修改后 a 的值
}// 主函数,程序的入口点
int main(void) {test1(); // 调用 test1 函数return 0; // 主函数正常结束,返回 0
}

好处:准确,只要命名空间中确实有这个实体,就能够准确调用(访问)
坏处:繁琐
2.using编译指令
如第一个C++程序,其中std代表的是标准命名空间。cout和endl都是std中的实体,使用了using编译指令后,这两个实体就可以直接使用了。
#include<iostream>
using namespace std;namespace A
{int a=100;void fun1(void){cout<<"a="<<a<<endl;}
} using namespace A;void test1(void)
{ fun1();a=200;fun1();} int main(void)
{ test1();return 0;
}
~
~

建议1
using编译指令尽量写在局部作用域,这样using编译指令的效果也会在其作用域结束时结束;可以避免命名冲突
错误案例
#include<iostream>
using namespace std;namespace A
{int a=100;} namespace B
{int a=200;
}using namespace A;
using namespace B; //A和B命令空间里的变量a会产生冲突void test1(void)
{ //这里的a不知道访问A还是B里的变量a;a=200;cout<<"a="<<a<<endl;} int main(void)
{ test1();return 0;
}
解决办法
1.使用作用域限定符

2.using编译指令尽量写在局部作用域,避免和其他变量名起冲突

3.using声明机制(推荐)
—— 需要什么就声明什么
建议将using声明语句写在局部作用域中。此时即使命名空间中实体与全局位置实体重名,在局部位置也遵循“就近原则”形成屏蔽
#include<iostream>
using std::cin;
using std::cout;
using std::endl;namespace A
{int a=10;int b=20;
}int a=1000;void test1(void)
{ using A::a;cout<<"a="<<a<<endl;
}int main(int argc,char*argv[])
{ test1();cout<<"a="<<a<<endl;return 0;
}

4.命名空间的嵌套使用
命名空间中还可以定义命名空间
#include<iostream>
using std::cin;
using std::cout;
using std::endl;namespace A
{int a=10;int b=20;namespace B{int c=200;}
}void test1(void)
{ using A::B::c;cout<<"c="<<c<<endl;
}int main(int argc,char*argv[])
{ test1();return 0;
}

5.匿名命名空间
命名空间还可以不定义名字,不定义名字的命名空间称为匿名命名空间(简称匿名空间)。
通常,如果我们希望一部分实体只在本文件中起作用,那么可以将它们定义在匿名空间中。
namespace {
//...
}
使用匿名空间中实体时,可以直接使用,也可以加上作用域限定符(没有空间名)
#include<iostream>
using std::cout;
using std::cin;
using std::endl;namespace
{int a=100;int b=200;int c=300;
}int main(int argc,char*argv[])
{cout<<"a="<<a<<endl;int b=2;cout<<"b="<<b<<endl;cout<<"b="<<::b<<endl;return 0;
}
~
~

匿名空间注意事项:
(1)匿名空间不要定义与全局空间中同名的实体;
(2)匿名空间中的实体不能跨模块调用。
6.命名空间补充
在同一个源文件中可以多次定义同名的命名空间,被认为是同一个命名空间,所以不能在其中定义相同的实体
#include<iostream>
using std::cout;
using std::cin;
using std::endl;namespace A
{int a=100;}namespace A
{int c=200;
}void test(void)
{using A::a;using A::c;cout<<"a="<<a<<endl;cout<<"c="<<c<<endl;
}int main(int argc,char*argv[])
{test();return 0;
}

3.const关键字
3.1修饰内置类型
const修饰的变量称为const常量,之后不能修改其值。(本质还是变量,使用时也是当成变量使用,只是被赋予只读属性)
const常量在定义时必须初始化。
#include<iostream>
using std::cin;
using std::cout;
using std::endl;void test1(void)
{ //只有读权限,没有写权限const int number1 = 10;int const number2 = 20;cout<<number1<<endl;cout<<number2<<endl;}int main(void)
{ test1();return 0;
}

宏定义的方式创建常量
#define MAX 100
3.2修饰指针类型*
1. 指向常量的指针
指向常量的指针意味着不能通过该指针来修改所指向对象的值,不过指针本身可以指向其他对象。
const 数据类型 * 指针名;
#include <iostream>
using std::cin;
using std::cout;
using std::endl;int main(void) {int num = 10;const int *ptr = #// *ptr = 20; // 错误,不能通过指向常量的指针修改所指向的值num = 20; // 可以直接修改 num 的值cout << *ptr << endl; // 输出 20return 0;
}
2. 常量指针
常量指针表示指针本身的值(即所指向的地址)不能被修改,不过可以通过该指针修改所指向对象的值。
数据类型 * const 指针名;
#include <iostream>
using std::cin;
using std::cout;
using std::endl;int main(void) {int num1 = 10;int num2 = 20;int * const ptr = &num1;*ptr = 30; // 可以通过常量指针修改所指向的值// ptr = &num2; // 错误,不能修改常量指针的值cout << *ptr << endl; // 输出 30return 0;
}
3. 指向常量的常量指针
指向常量的常量指针既不能修改指针所指向对象的值,也不能修改指针本身的值。
const 数据类型 * const 指针名;
#include <iostream>
using std::cin;
using std::cout;
using std::endl;int main(void) {int num1 = 10;int num2 = 20;const int * const ptr = &num1;// *ptr = 30; // 错误,不能通过指向常量的常量指针修改所指向的值// ptr = &num2; // 错误,不能修改指向常量的常量指针的值cout << *ptr << endl; // 输出 10return 0;
}
总结
指向常量的指针:不能通过指针修改所指向对象的值,但指针可以指向其他对象。
常量指针:指针本身的值不能修改,但可以通过指针修改所指向对象的值。
指向常量的常量指针:既不能修改指针所指向对象的值,也不能修改指针本身的值。
3.3const 常量和宏定义常量区别
发生时机:
宏定义在 C 语言预处理阶段,单纯进行字符串替换。比如 #define PI 3.14 ,预处理时会把代码中所有 PI 都替换成 3.14 。
const 常量在编译时起作用,它本质近似变量,只是被 const 限定为只读。像 const double pi = 3.14; ,编译时会处理这个定义。
类型和安全检查:
宏定义没有类型概念,不做类型检查。如 #define ADD(a, b) ((a)+(b)) ,传入不同类型参数都直接替换展开,可能引发错误。
const 常量有明确类型,编译期会执行类型检查。如 const int num = 5; ,类型不匹配的赋值等操作编译时会报错 。
通常推荐用 const 常量替代宏定义常量,能利用编译期类型检查机制,减少因宏定义的简单替换带来的错误风险。
相关文章:
C++基础精讲-01
1C概述 1.1初识C 发展历程: C 由本贾尼・斯特劳斯特卢普在 20 世纪 70 年代开发,它在 C 语言的基础上增加了面向对象编程的特性,最初被称为 “C with Classes”,后来逐渐发展成为独立的 C 语言。 语言特点 (1&#x…...
为什么Java不支持多继承?如何实现多继承?
一、前言 Java不支持多继承(一个类继承多个父类)主要出于文中设计考虑;核心目的是简化语言复杂性并避免潜在的歧义性问题。 二、直接原因:菱形继承/钻石继承问题(Diamond Problem) 假设存在如下继承关系&…...
E8流程多行明细行字符串用I分隔,赋值到主表
需求:明细行摘要字段赋值到主表隐藏字段,隐藏摘要字段在标题中显示 代码如下,代码中的获取字段名获取方式,自行转换成jQuery("#fieldid").val()替换。 //1:参数表单id 2:流程字段名 3:0代表主表,1代表明细…...
QML面试笔记--UI设计篇04交互控件
1. QML中常用交互控件 1.1. Button1.2. Slider1.3. ProgressBar1.4. TextField1.5. TextArea1.6. ComboBox1.7. CheckBox1.8. RadioButton1.9. Menu1.10. Dialog 1. QML中常用交互控件 在万物互联的智能时代,QML凭借其声明式语法和跨平台能力,…...
[特殊字符] Spring Boot 日志系统入门博客大纲(适合初学者)
一、前言 📌 为什么日志在项目中如此重要? 在开发和维护一个后端系统时,日志就像程序运行时的“黑匣子”,帮我们记录系统的各种行为和异常。一份良好的日志,不仅能帮助我们快速定位问题,还能在以下场景中…...
【人工智能】AI大模型开发数学基础指南
目录 学习内容**1. 线性代数****2. 概率与统计****3. 微积分****4. 优化理论****5. 信息论****6. 数值计算****7. 离散数学****8. 统计学进阶****如何学习?****总结** 如何学习**1. 明确学习目标****2. 分阶段学习计划****阶段 1:夯实基础****阶段 2&…...
Express中间件(Middleware)详解:从零开始掌握(1)
1. 中间件是什么? 想象中间件就像一个"加工流水线",请求(Request)从进入服务器到返回响应(Response)的过程中,会经过一个个"工作站"进行处理。 简单定义:中间件是能够访问请求对象(req)、响应对象(res)和下…...
STM32单片机中EXTI的工作原理
目录 1. EXTI概述 2. EXTI的组成部分 3. 工作原理 3.1 引脚配置 3.2 中断触发条件 3.3 中断使能 3.4 中断处理 4. 使用示例 5. 注意事项 结论 在STM32单片机中,EXTI(外部中断)是一种用于处理外部事件的机制,能够提高对硬…...
现代工业测试的核心支柱:电机试验工作台?(北重机械厂家)
电机试验工作台是现代工业测试中的核心支柱之一。这种工作台通常用于对各种类型的电机进行性能测试、负载测试和耐久性测试。通过电机试验工作台,工程师可以评估电机的效率、功率输出、转速、扭矩、温度等关键参数,从而确保电机的设计符合要求࿰…...
oracle 11g密码长度和复杂度查看与设置
verify_function_11G 的密码复杂性要求: 密码长度至少为 8 个字符。 密码必须包含至少一个数字和一个字母字符。 密码不能与用户名相同或相似。 密码不能是服务器名或其变体。 密码不能是常见的弱密码(如 welcome1、oracle123 等)。 注意事项&…...
CVE-2025-32375 | Windows下复现 BentoML runner 服务器远程命令执行漏洞
目录 1. 漏洞描述2. 漏洞复现1. 安装 BentoML 1.4.72. 创建模型3. 构建模型4. 托管模型5. 执行exp 3. POC4. 补充学习 参考链接: https://mp.weixin.qq.com/s/IxLZr83RvYqfZ_eXhtNvgg https://github.com/bentoml/BentoML/security/advisories/GHSA-7v4r-c989-xh26 …...
某局jsvmp算法分析(dunshan.js/lzkqow23819/lzkqow39189)
帮朋友看一个税某局的加密算法。 传送门 (需要帐号登陆的 普通人没授权也看不了) 废话不多说直接抓包开干 这里可以看到一个headers中的加密参数 lzkqow23819 以及url路径里面的6eMrZlPH(这个有点像瑞数里面的) 还有就是cookies里面的这几个…...
深入剖析 Kafka 的零拷贝原理:从操作系统到 Java 实践
Kafka 作为一款高性能的分布式消息系统,其卓越的吞吐量和低延迟特性得益于多种优化技术,其中“零拷贝”(Zero-Copy)是核心之一。零拷贝通过减少用户态与内核态之间的数据拷贝,提升了 Kafka 在消息传输中的效率。本文将…...
AlmaLinux9.5 修改为静态IP地址
查看当前需要修改的网卡名称 ip a进入网卡目录 cd /etc/NetworkManager/system-connections找到对应网卡配置文件进行修改 修改配置 主要修改ipv4部分,改成自己的IP配置 [ipv4] methodmanual address1192.168.252.129/24,192.168.252.254 dns8.8.8.8重启网卡 …...
内联函数通常定义在头文件中的原因详解
什么是内联函数? 内联函数(inline function)是C中的一种函数优化机制,通过在函数声明前加上inline关键字,建议编译器将函数调用替换为函数体本身的代码,从而减少函数调用的开销。 为什么内联函数需要定义…...
操作系统 4.4-从生磁盘到文件
文件介绍 操作系统中对磁盘使用的第三层抽象——文件。这一层抽象建立在盘块(block)和文件(file)之间,使得用户可以以更直观和易于理解的方式与磁盘交互,而无需直接处理磁盘的物理细节如扇区(se…...
免费多语言文档翻译软件推荐
软件介绍 今天给大家介绍一款文档翻译助手。它能够支持PDF、Word等多种文档格式,涵盖中文、英文、日语等多语言互译。此软件在翻译过程中精选保留文档原貌,每段文字、每个图表的匹配都十分完美,还依托顶尖翻译大模型,让翻译结果符…...
安全序列(DP)
#include <bits/stdc.h> using namespace std; const int MOD1e97; const int N1e65; int f[N]; int main() {int n,k;cin>>n>>k;f[0]1;for(int i1;i<n;i){f[i]f[i-1]; // 不放桶:延续前一位的所有方案if(i-k-1>0){f[i](f[i]f[i-k…...
【Flask开发】嘿马文学web完整flask项目第4篇:4.分类,4.分类【附代码文档】
教程总体简介:2. 目标 1.1产品与开发 1.2环境配置 1.3 运行方式 1.4目录说明 1.5数据库设计 2.用户认证 Json Web Token(JWT) 3.书架 4.1分类列表 5.搜索 5.3搜索-精准&高匹配&推荐 6.小说 6.4推荐-同类热门推荐 7.浏览记录 8.1配置-阅读偏好 8.配置 9.1项目…...
SQL开发的智能助手:通义灵码在IntelliJ IDEA中的应用
SQL 是一种至关重要的数据库操作语言,尽管其语法与通用编程语言有所不同,但因其在众多应用中的广泛使用,大多数程序员都具备一定的 SQL 编写能力。然而,当面对复杂的 SQL 语句或优化需求时,往往需要专业数据库开发工程…...
基于 Q - learning 算法的迷宫导航
这段 Python 代码实现了一个基于 Q - learning 算法的迷宫导航系统。代码通过定义迷宫环境、实现 Q - learning 算法来训练智能体,使其能够在迷宫中找到从起点到终点的最优路径,同时利用训练好的 Q 表来测试智能体的导航能力。 在这个代码实现的迷宫环境…...
解决:AttributeError: module ‘cv2‘ has no attribute ‘COLOR_BGR2RGB‘
opencv AttributeError: module ‘cv2’ has no attribute ‘warpFrame’ 或者 opencv 没有 rgbd 解决上述问题的方法是: 卸载重装。 但是一定要卸载干净,仅仅卸载opencv-python是不行的。无限重复都报这个错。 使用pip list | grep opencv查看相关的…...
NutriJarvis:AI慧眼识餐,精准营养触手可及!—— 基于深度学习的菜品识别与营养计算系统
NutriJarvis:AI慧眼识餐,精准营养触手可及!—— 基于深度学习的菜品识别与营养计算系统 NutriJarvis 是一个基于深度学习的菜品识别与营养计算系统,旨在通过计算机视觉技术自动识别餐盘中的食物,并估算其营养成分&…...
作为一名java技术博主如何突围
作为一位Java开发和技术博主,想要在抖音上快速提升粉丝数量和视频播放量,可以结合以下策略进行优化: 1. 明确目标受众与技术方向 细分领域:技术领域广泛,可以专注于Java开发、算法、框架解析(如Spring Boo…...
【LaTeX】
基本使用 \documentclass 类型:文章(article)、报告(report)、书(book) 中文的文章是ctexart,中文字体是UTF8 \documentclass[UTF8]{ctexart} []说明可以省略不写的意思…...
细说STM32单片机FreeRTOS任务管理相关函数及多任务编程的实现方法
目录 一、FreeRTOS任务管理相关函数 1、FreeRTOS函数 2、FreeRTOS宏函数 3、主要函数功能说明 (1)创建任务osThreadNew() (2)删除任务vTaskDelete() (3)挂起任务vTaskSuspend() (4&…...
uniapp微信小程序基于wu-input二次封装TInput组件(支持点击下拉选择、支持整数、电话、小数、身份证、小数点位数控制功能)
一、 最终效果 二、实现了功能 1、支持输入正整数---设置specifyTypeinteger 2、支持输入数字(含小数点)---设置specifyTypedecimal,可设置decimalLimit来调整小数点位数 3、支持输入手机号--设置specifyTypephone 4、支持输入身份证号---设…...
VLM-R1GRPO微调,强化学习训练, 实战训练教程(2)
https://www.dong-blog.fun/post/2013 VLM-R1GRPO微调, 实战训练教程(1): https://www.dong-blog.fun/post/1961 本博客这次使用多图进行GRPO。 官方git项目:https://github.com/om-ai-lab/VLM-R1?tabreadme-ov-f…...
系统弹出消息功能,且保证用户只能获取弹出一次消息
要实现系统弹出消息功能,且保证用户只能获取弹出一次消息,你可以借助 Redis 来达成。基本思路是:把消息存于 Redis 的列表中,同时用 Redis 的集合记录用户是否已接收过该消息。下面是一个示例工具类,其中包含推送消息和…...
Python代码解释
文章目录 代码解析执行过程等价写法其他类似操作 这段代码使用了 Python 的 map() 函数和 lambda 表达式来对列表中的每个元素进行平方运算。让我详细解释一下: 代码解析 numbers [1, 2, 3, 4] squared list(map(lambda x: x**2, numbers))numbers [1, 2, 3, …...
