当前位置: 首页 > article >正文

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 = &num;// *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 发展历程&#xff1a; C 由本贾尼・斯特劳斯特卢普在 20 世纪 70 年代开发&#xff0c;它在 C 语言的基础上增加了面向对象编程的特性&#xff0c;最初被称为 “C with Classes”&#xff0c;后来逐渐发展成为独立的 C 语言。 语言特点 &#xff08;1&#x…...

为什么Java不支持多继承?如何实现多继承?

一、前言 Java不支持多继承&#xff08;一个类继承多个父类&#xff09;主要出于文中设计考虑&#xff1b;核心目的是简化语言复杂性并避免潜在的歧义性问题。 二、直接原因&#xff1a;菱形继承/钻石继承问题&#xff08;Diamond Problem&#xff09; 假设存在如下继承关系&…...

E8流程多行明细行字符串用I分隔,赋值到主表

需求&#xff1a;明细行摘要字段赋值到主表隐藏字段&#xff0c;隐藏摘要字段在标题中显示 代码如下&#xff0c;代码中的获取字段名获取方式&#xff0c;自行转换成jQuery("#fieldid").val()替换。 //1:参数表单id 2:流程字段名 3:0代表主表&#xff0c;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中常用交互控件 在万物互联的智能时代&#xff0c;QML凭借其‌声明式语法‌和‌跨平台能力‌&#xff0c…...

[特殊字符] Spring Boot 日志系统入门博客大纲(适合初学者)

一、前言 &#x1f4cc; 为什么日志在项目中如此重要&#xff1f; 在开发和维护一个后端系统时&#xff0c;日志就像程序运行时的“黑匣子”&#xff0c;帮我们记录系统的各种行为和异常。一份良好的日志&#xff0c;不仅能帮助我们快速定位问题&#xff0c;还能在以下场景中…...

【人工智能】AI大模型开发数学基础指南

目录 学习内容**1. 线性代数****2. 概率与统计****3. 微积分****4. 优化理论****5. 信息论****6. 数值计算****7. 离散数学****8. 统计学进阶****如何学习&#xff1f;****总结** 如何学习**1. 明确学习目标****2. 分阶段学习计划****阶段 1&#xff1a;夯实基础****阶段 2&…...

Express中间件(Middleware)详解:从零开始掌握(1)

1. 中间件是什么&#xff1f; 想象中间件就像一个"加工流水线"&#xff0c;请求(Request)从进入服务器到返回响应(Response)的过程中&#xff0c;会经过一个个"工作站"进行处理。 简单定义&#xff1a;中间件是能够访问请求对象(req)、响应对象(res)和下…...

STM32单片机中EXTI的工作原理

目录 1. EXTI概述 2. EXTI的组成部分 3. 工作原理 3.1 引脚配置 3.2 中断触发条件 3.3 中断使能 3.4 中断处理 4. 使用示例 5. 注意事项 结论 在STM32单片机中&#xff0c;EXTI&#xff08;外部中断&#xff09;是一种用于处理外部事件的机制&#xff0c;能够提高对硬…...

现代工业测试的核心支柱:电机试验工作台?(北重机械厂家)

电机试验工作台是现代工业测试中的核心支柱之一。这种工作台通常用于对各种类型的电机进行性能测试、负载测试和耐久性测试。通过电机试验工作台&#xff0c;工程师可以评估电机的效率、功率输出、转速、扭矩、温度等关键参数&#xff0c;从而确保电机的设计符合要求&#xff0…...

oracle 11g密码长度和复杂度查看与设置

verify_function_11G 的密码复杂性要求: 密码长度至少为 8 个字符。 密码必须包含至少一个数字和一个字母字符。 密码不能与用户名相同或相似。 密码不能是服务器名或其变体。 密码不能是常见的弱密码&#xff08;如 welcome1、oracle123 等&#xff09;。 注意事项&…...

CVE-2025-32375 | Windows下复现 BentoML runner 服务器远程命令执行漏洞

目录 1. 漏洞描述2. 漏洞复现1. 安装 BentoML 1.4.72. 创建模型3. 构建模型4. 托管模型5. 执行exp 3. POC4. 补充学习 参考链接&#xff1a; https://mp.weixin.qq.com/s/IxLZr83RvYqfZ_eXhtNvgg https://github.com/bentoml/BentoML/security/advisories/GHSA-7v4r-c989-xh26 …...

某局jsvmp算法分析(dunshan.js/lzkqow23819/lzkqow39189)

帮朋友看一个税某局的加密算法。 传送门 &#xff08;需要帐号登陆的 普通人没授权也看不了&#xff09; 废话不多说直接抓包开干 这里可以看到一个headers中的加密参数 lzkqow23819 以及url路径里面的6eMrZlPH(这个有点像瑞数里面的&#xff09; 还有就是cookies里面的这几个…...

深入剖析 Kafka 的零拷贝原理:从操作系统到 Java 实践

Kafka 作为一款高性能的分布式消息系统&#xff0c;其卓越的吞吐量和低延迟特性得益于多种优化技术&#xff0c;其中“零拷贝”&#xff08;Zero-Copy&#xff09;是核心之一。零拷贝通过减少用户态与内核态之间的数据拷贝&#xff0c;提升了 Kafka 在消息传输中的效率。本文将…...

AlmaLinux9.5 修改为静态IP地址

查看当前需要修改的网卡名称 ip a进入网卡目录 cd /etc/NetworkManager/system-connections找到对应网卡配置文件进行修改 修改配置 主要修改ipv4部分&#xff0c;改成自己的IP配置 [ipv4] methodmanual address1192.168.252.129/24,192.168.252.254 dns8.8.8.8重启网卡 …...

内联函数通常定义在头文件中的原因详解

什么是内联函数&#xff1f; 内联函数&#xff08;inline function&#xff09;是C中的一种函数优化机制&#xff0c;通过在函数声明前加上inline关键字&#xff0c;建议编译器将函数调用替换为函数体本身的代码&#xff0c;从而减少函数调用的开销。 为什么内联函数需要定义…...

操作系统 4.4-从生磁盘到文件

文件介绍 操作系统中对磁盘使用的第三层抽象——文件。这一层抽象建立在盘块&#xff08;block&#xff09;和文件&#xff08;file&#xff09;之间&#xff0c;使得用户可以以更直观和易于理解的方式与磁盘交互&#xff0c;而无需直接处理磁盘的物理细节如扇区&#xff08;se…...

免费多语言文档翻译软件推荐

软件介绍 今天给大家介绍一款文档翻译助手。它能够支持PDF、Word等多种文档格式&#xff0c;涵盖中文、英文、日语等多语言互译。此软件在翻译过程中精选保留文档原貌&#xff0c;每段文字、每个图表的匹配都十分完美&#xff0c;还依托顶尖翻译大模型&#xff0c;让翻译结果符…...

安全序列(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]; // 不放桶&#xff1a;延续前一位的所有方案if(i-k-1>0){f[i](f[i]f[i-k…...

【Flask开发】嘿马文学web完整flask项目第4篇:4.分类,4.分类【附代码文档】

教程总体简介&#xff1a;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 是一种至关重要的数据库操作语言&#xff0c;尽管其语法与通用编程语言有所不同&#xff0c;但因其在众多应用中的广泛使用&#xff0c;大多数程序员都具备一定的 SQL 编写能力。然而&#xff0c;当面对复杂的 SQL 语句或优化需求时&#xff0c;往往需要专业数据库开发工程…...

基于 Q - learning 算法的迷宫导航

这段 Python 代码实现了一个基于 Q - learning 算法的迷宫导航系统。代码通过定义迷宫环境、实现 Q - learning 算法来训练智能体&#xff0c;使其能够在迷宫中找到从起点到终点的最优路径&#xff0c;同时利用训练好的 Q 表来测试智能体的导航能力。 在这个代码实现的迷宫环境…...

解决:AttributeError: module ‘cv2‘ has no attribute ‘COLOR_BGR2RGB‘

opencv AttributeError: module ‘cv2’ has no attribute ‘warpFrame’ 或者 opencv 没有 rgbd 解决上述问题的方法是&#xff1a; 卸载重装。 但是一定要卸载干净&#xff0c;仅仅卸载opencv-python是不行的。无限重复都报这个错。 使用pip list | grep opencv查看相关的…...

NutriJarvis:AI慧眼识餐,精准营养触手可及!—— 基于深度学习的菜品识别与营养计算系统

NutriJarvis&#xff1a;AI慧眼识餐&#xff0c;精准营养触手可及&#xff01;—— 基于深度学习的菜品识别与营养计算系统 NutriJarvis 是一个基于深度学习的菜品识别与营养计算系统&#xff0c;旨在通过计算机视觉技术自动识别餐盘中的食物&#xff0c;并估算其营养成分&…...

作为一名java技术博主如何突围

作为一位Java开发和技术博主&#xff0c;想要在抖音上快速提升粉丝数量和视频播放量&#xff0c;可以结合以下策略进行优化&#xff1a; 1. 明确目标受众与技术方向 细分领域&#xff1a;技术领域广泛&#xff0c;可以专注于Java开发、算法、框架解析&#xff08;如Spring Boo…...

【LaTeX】

基本使用 \documentclass 类型&#xff1a;文章&#xff08;article&#xff09;、报告&#xff08;report&#xff09;、书&#xff08;book&#xff09; 中文的文章是ctexart&#xff0c;中文字体是UTF8 \documentclass[UTF8]{ctexart} []说明可以省略不写的意思&#xf…...

细说STM32单片机FreeRTOS任务管理相关函数及多任务编程的实现方法

目录 一、FreeRTOS任务管理相关函数 1、FreeRTOS函数 2、FreeRTOS宏函数 3、主要函数功能说明 &#xff08;1&#xff09;创建任务osThreadNew() &#xff08;2&#xff09;删除任务vTaskDelete() &#xff08;3&#xff09;挂起任务vTaskSuspend() &#xff08;4&…...

uniapp微信小程序基于wu-input二次封装TInput组件(支持点击下拉选择、支持整数、电话、小数、身份证、小数点位数控制功能)

一、 最终效果 二、实现了功能 1、支持输入正整数---设置specifyTypeinteger 2、支持输入数字&#xff08;含小数点&#xff09;---设置specifyTypedecimal&#xff0c;可设置decimalLimit来调整小数点位数 3、支持输入手机号--设置specifyTypephone 4、支持输入身份证号---设…...

VLM-R1GRPO微调,强化学习训练, 实战训练教程(2)

https://www.dong-blog.fun/post/2013 VLM-R1GRPO微调&#xff0c; 实战训练教程&#xff08;1&#xff09;&#xff1a; https://www.dong-blog.fun/post/1961 本博客这次使用多图进行GRPO。 官方git项目&#xff1a;https://github.com/om-ai-lab/VLM-R1?tabreadme-ov-f…...

系统弹出消息功能,且保证用户只能获取弹出一次消息

要实现系统弹出消息功能&#xff0c;且保证用户只能获取弹出一次消息&#xff0c;你可以借助 Redis 来达成。基本思路是&#xff1a;把消息存于 Redis 的列表中&#xff0c;同时用 Redis 的集合记录用户是否已接收过该消息。下面是一个示例工具类&#xff0c;其中包含推送消息和…...

Python代码解释

文章目录 代码解析执行过程等价写法其他类似操作 这段代码使用了 Python 的 map() 函数和 lambda 表达式来对列表中的每个元素进行平方运算。让我详细解释一下&#xff1a; 代码解析 numbers [1, 2, 3, 4] squared list(map(lambda x: x**2, numbers))numbers [1, 2, 3, …...