C++ 【衔接篇】
大名鼎鼎的c++实际上是由c语言扩展而来的,它最初是由本贾尼在20世纪80年代开发。目的是支持面向对象编程,同时保持c语言高效和可移植等优点。c++是c的扩展,在一定程度上解决了c语言在特殊场景下的使用局限。
1、命名空间
在详细说明命名空间之前,很有必要谈谈命名空间的由来。在c语言开发中,由不同程序员协作写的项目文件经常会出现一个问题:定义的全局变量或函数可能会产生命名冲突的问题。这种大型项目的开发可能会涉及上万行甚至更多行的代码量,进行逐一命名修改是行不通的。为了解决这一问题,c++引进了一个新的概念:命名空间。命名空间的引入主要是要解决命名冲突问题。
关键字:namespace ,使用namespace关键字将变量进行隔离可解决命名冲突。
1.1、命名空间定义
定义命名空间需要使用namespace关键字,后面跟命名空间的名字,然后需要接一对大括号{},这里需要与结构体的定义进行区分,命名空间的在定义之后没有分号 。大括号中即为命名空间的成员。
namespace my_space
{int memmove = 2;char define = '0';
}
一般情况下,程序对于变量的访问顺序为:局部优先 其次全局。命名空间就像是一个隔离房,只有将房门打开和指定的方式才能访问到空间内的变量。也就是说,要么直接打开房门,要么指定去这个房间寻找。
1.2、命名空间的使用
先说打开房门进行访问的情况,需要在全局加上下面的代码,这样就可以正常访问空间内的变量。 这种方式就是展开命名空间,空间内的变量就会暴露到全局。
using namespce my_space;
其实就是使用指定的方式进行访问,所谓指定方式就是加命名空间名称以及作用域限定符。(::),使用方法如下,这样就会到指定的命名空间中去寻找变量再进行访问。
int main()
{printf("%d\n", my_space::define);return 0;
}
也还可以使用using+命名空间名称::常用变量名 单独展开某个常用变量。
using my_space::memmove;//单独展开一个常用变量
2、输入和输出
C++将标准库的函数定义和实现都放在std命名空间中,所以再使用之前最简洁的方式就是展开命名空间。例如在C语言中学习到的第一个语句hello world使用c++就会用如下的形式:
#include<iostream>
// std是C++标准库的命名空间名,C++将标准库的定义实现都放到这个命名空间中
using namespace std;int main()
{cout<<"Hello world!!!"<<endl;return 0;
}
使用cout标准输出对象(控制台)和cin标准输入对象(键盘)时,必须包含<iostream>头文件以及按照命名空间的使用方式使用std。cout和cin是全局的流对象,endl是特殊的C++符号,表示换行(和c语言中的'\n'是相同的作用),他们都包含在<iostream>头文件中。
<< 是流插入运算符, >> 是流提取运算符。实际上,cout和cin分别是ostream和istream类型的对象。它们在使用时可以自动识别变量的类型,不需要像c语言中输入输出函数那样指定变量的类型。
std命名空间的使用惯例:
1、在日常练习中,建议直接using namespace std即可,这样就很方便。
2、using namespace std展开,标准库就会全部暴露出来,如果我们定义跟库重命名的对象或者函数时,就会存在冲突问题,该问题在日常练习中很少出现,但是在项目开发中由于代码量大就很容易出现命名冲突的问题。所以在项目开发中,就使用std::cout 或者 using std::cout这样的形式。
3、缺省参数
3.1、缺省参数概念
缺省参数也叫默认参数,缺省参数是在函数声明或者定义时为函数指定一个缺省值。在调用该函数时,如果没有指定实参则采用该形参的缺省值,否则就是用指定的形参。用通俗的话来说就是:在函数定义或者声明的时候设定了一个参数具有默认值,在调用时有实参传入就使用实参,没有实参就使用默认值。(缺省值必须是常量或者全局变量)
void Func(int a = 0)
{cout<<a<<endl;
}int main()
{Func(); // 没有传参时,使用参数的默认值Func(10); // 传参时,使用指定的实参return 0;
}
3.2、缺省参数的分类
全缺省参数:所有形参都设置了默认值。
void Func(int a = 10, int b = 20, int c = 30){cout<< "a = " << a << endl;cout<< "b = " << b << endl;cout<< "c = " << c << endl;}
半缺省参数(注意:只能从右往左缺省,不能间隔。缺省参数不能在函数声明和定义中同时出现)原因是因为:如果声明与定义的位置同时出现,恰巧两个位置提供的值不同,编译器就无法确定该使用哪个缺省值。
void Func(int a, int b = 10, int c = 20)
{cout<< "a = " << a << endl;cout<< "b = " << b << endl;cout<< "c = " << c << endl;
}
4、函数重载
函数重载:C++允许同一作用域中声明多个功能类似的同名函数,这些同名函数的形参列表不同(参数个数 或 类型顺序)不同。这里要强调的是:函数重载只与参数有关,与返回值类型无关。
#include<iostream>
using namespace std;
// 1、参数类型不同
int Add(int left, int right)
{cout << "int Add(int left, int right)" << endl;return left + right;
}double Add(double left, double right)
{cout << "double Add(double left, double right)" << endl;return left + right;
}
// 2、参数个数不同
void f()
{cout << "f()" << endl;
}void f(int a)
{cout << "f(int a)" << endl;
}
// 3、参数类型顺序不同
void f(int a, char b)
{cout << "f(int a,char b)" << endl;
}void f(char b, int a)
{cout << "f(char b, int a)" << endl;
}
那为什么C语言不支持函数重载?C++却可以呢?
第一、C语言为什么不可以?这是因为C语言的编译链接规则,多个源文件在编译成目标文件之后,会对源文件中的全局变量喝函数名生成符号表。这个符号表用于后续的链接过程,在链接过程中假设A文件使用了B文件的函数,那么编译器在生成可执行程序之前的链接部分就会查找符号表(全局变量、函数名)进行对应的链接。而C语言的编译规则中对于函数名生成符号表时只与函数名有关,也就是说C语言在编译过程中的名字修饰规则只与函数名字有关,与参数无关。假设存在两个同名函数,在这一过程中就会产生冲突,导致在连接过程中编译器无法确定链接哪一个函数,从而导致连接错误。
那么C++是怎么做到的呢?C++在出现问题的地方进行了改进。C++在生成目标文件中的符号时,修改了函数修饰规则。将函数后面形参的类型也纳入了最终的符号,也就是说函数名一致,形参类型不一致,形参个数不一致,形参类型顺序不一致时产生的函数标签就会不一致。在链接过程中,编译器仍然可以找到对应的调用函数进行链接。
5、引用
引用就是给变量再起了一个别名,它不会创建新的空间,而是在原有空间上增加一个新的标签。象现实生活中:小猫还可以被叫成咪咪,还可以被叫成富贵,这是一个道理。同样地,C++中一块空间可以有多个引用名称。
引用定义类型:类型& 引用变量名(对象名)= 引用实体
void TestRef()
{int a = 10;int& ra = a;//<====定义引用类型printf("%p\n", &a);printf("%p\n", &ra);
}
要注意的一点是:引用类型必须和引用实体是同种类型的
5.1、引用特性
1.引用在定义时必须进行初始化。
2.一个变量可以有多个引用。
3.引用一旦引用一个实体,再不能引用其他实体。
5.2、使用场景
1、做参数:使用引用做参数时可以起到形参改变实参的作用,达到了指针的效果,但是实现过程要比使用指针简单,且不需要多余开辟空间来存储指针变量。
void Swap(int& left, int& right)
{int temp = left;left = right;right = temp;
}
2、做返回值
一般情况下,函数在返回值之前会将要返回值的拷贝到一块临时空间中(因为函数在调用结束之后栈帧一旦销毁,栈帧内的数据就无法访问且存在丢失风险),在主调函数调用完之后,临时空间的返回值再次拷贝到主调函数要赋值的目标变量ret。
如果函数返回时,出了函数作用域,如果返回对象还在(没有还给操作系统),则可以使用引用返回,如果已经还给操作系统,则必须使用传值返回。
int& Count()
{static int n = 0;//变量0在静态区中n++;// ...return n;
}
5.3引用和指针的区别
1.引用就是定义一个变量的别名,指针用来存储一个变量的地址。
2.引用在定义时必须要进行初始化,指针没有要求。
3.引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何一个同类型实体。
4.没有NULL引用,但有NULL指针。
5.在sizeof()中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数。(32位系统下是4个字节,64位系统下是8个字节)
6.引用+1可以实现引用的实体+1,而指针加一是指针向后偏移一个指针指向类型的大小。
7.有多级指针,但没有多级引用。
8.访问实体方式不同,指针需要解引用,引用编译器会自己处理。
6、内联函数
以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方进行展开,没有函数调用建立栈帧的内存消耗,内联函数提升程序的运行效率。如果内联函数的太长,编译器也会不听取内联建议,在执行过程中仍然采用调用的形式进行使用。inline是一种以空间换时间的做法,在编译阶段,编译器会用函数体替换函数调用,缺陷:可能会使目标文件变大,优势:少了调用开销,提高程序运行效率。
注意:inline不建议声明和定义分离,分离会导致链接错误。因为inline被展开,就没有函数地址了,链接就会找不到。
我们可以感受到内联函数在实现上与宏的实现相似,宏的优缺点:优点(增加代码的复用性,提高性能),缺点(代码可读性差,不方便调试)。C++中如果有短小的函数且反复调用,就可以使用内联函数来进行实现。
7、auto关键字
auto关键字是在变量的类型冗长或者不是很清楚变量的类型时进行使用的,变量的类型需要由编译器来进行推导得到。
1.用auto声明指针类型时,用auto和auto*没有任何区别,但auto声明引用类型时必须加&.
2.在同一行定义多个变量时,这些变量必须是相同的类型,否则编译器就会报错。
void TestAuto()
{auto a = 1, b = 2; auto c = 3, d = 4.0; // 该行代码会编译失败,因为c和d的初始化表达式类型不同
}
3.auto不能用来声明数组。
8、基于范围的for循环
对于一个有范围的集合来而言,程序员来说明范围是多余的,有时候还会很容易犯错误。C++中引入了基于范围的for循环。for循环后的括号由冒号:分为两部分,第一部分是范围内用于迭代的变量,第二部分则表示被迭代的范围。
void TestFor()
{int array[] = { 1, 2, 3, 4, 5 };for(auto& e : array)e *= 2;for(auto e : array)cout << e << " ";return 0;
}
与普通循环类似,可以使用continue来结束本次循环,也可以使用break来跳出整个循环。这里要注意的是,使用范围for循环时的范围必须是确定。
相关文章:
C++ 【衔接篇】
大名鼎鼎的c实际上是由c语言扩展而来的,它最初是由本贾尼在20世纪80年代开发。目的是支持面向对象编程,同时保持c语言高效和可移植等优点。c是c的扩展,在一定程度上解决了c语言在特殊场景下的使用局限。 1、命名空间 在详细说明命名空间之前…...
qcreator 调试原理
在 Qt 开发中,Qt Creator 是一个集成开发环境(IDE),用于开发 Qt 应用程序。Qt Creator 提供了强大的调试功能,可以帮助开发者高效地调试 C、QML 等语言的应用程序。Qt Creator 支持多种调试工具,包括基于 G…...
Windows 系统中的组策略编辑器如何打开?
组策略是 Windows 操作系统中用于设置计算机和用户配置的重要工具。它允许管理员控制各种系统功能,从桌面背景到安全设置等。对于 Windows 专业版、企业版和教育版用户来说,可以通过组策略编辑器(Group Policy Editor)来管理这些设…...
scala的泛型类
泛型:类型参数化 泛型类指的是把泛型定义到类的声明上, 即:该类中的成员的参数类型是由泛型来决定的. 在创建对象时, 明确具体的数据类型. 定义格式: class 类名(成员名:数据类型) class 类名[泛型名](成员名:泛型名) 参考代…...
基于Couchbase的数据构建方案:数仓分层
初步方案是将公共层和报表层分别放在不同的bucket中,这种设计从存储和访问优化的角度是合理的,但仍有以下细节需要考虑: 1. 数仓公共层设计(origin bucket) 合理性分析: 将ODS、DWD、DWS层的数据放在一个b…...
信创改造-Spring Boot 项目部署至 TongWeb
打 war 包参考:https://blog.csdn.net/z1353095373/article/details/144330999...
supervision - 好用的计算机视觉 AI 工具库
Supervision库是一款出色的Python计算机视觉低代码工具,其设计初衷在于为用户提供一个便捷且高效的接口,用以处理数据集以及直观地展示检测结果。简化了对象检测、分类、标注、跟踪等计算机视觉的开发流程。开发者仅需加载数据集和模型,就能轻…...
程序的调试
一名优秀的程序员也是一名出色的侦探,每一次调试都是尝试破案的过程 目录 前言 一、什么是调试? 二、调试 1.调试是什么 2.基本步骤 三、调试注意事项 1.怎么写出易于调试的代码 assert(断言) const 2.常见错误 总结 前言 主要是怎么调试,调…...
使用html 和javascript 实现微信界面功能2
1.功能说明: 对上一篇的基础上进行了稍稍改造 主要修改点: 搜索功能: 在搜索框后面增加了搜索按钮。 搜索按钮调用performSearch函数来执行搜索操作。 表单形式的功能: 上传文件: 修改为表单形式,允许用户通过文件输入控件选择文件并上传。 …...
虚幻引擎Actor类生命周期
AActor构造函数 在AActor类的构造函数中,虚幻引擎会初始化与该Actor相关的一些关键属性,比如: 默认的组件(如RootComponent、MeshComponent等)。默认的属性设置,例如位置、旋转、缩放等。还会调用BeginPlay等生命周期函数,但在构造函数中,这些函数不会执行。当你在场景…...
记录2024-leetcode-字符串DP
10. 正则表达式匹配 - 力扣(LeetCode)...
爬虫获取的数据如何有效存储和管理?
爬虫获取的数据如何有效存储和管理,涉及到数据的采集、存储、清洗、分析和保护等多个方面。以下是一些关键步骤和最佳实践: 1. 数据采集与同步 API接口同步:通过API接口将数据从数据源传输到目标位置,并保持数据的一致性和完整性…...
[Unity] AppLovin Max接入Native 广告 IOS篇
NativeIOS构建流程 (接入之前备份之前打包得Xcode工程) 下载资源 1.将以下文件放入Unity Assets->Plugins->IOS文件夹下 2.Unity更新max版本至12.4.1 UnityPlugin 6.4.3以上(很重要) 3.NativeSDKManager.CS根据以下附…...
康耐视智能相机(Insight)通过ModbusTCP发送字符串到倍福(BECKHOFF)PLC中
文章目录 1.背景2.分析3.实现3.1.PLC的ModbusTCP_Server3.1.1.安装TF6250-Modbus-TCP3.1.2.PLC设置 3.2.智能相机的ModbusTCP_Client3.2.1.了解ModbusTCP的协议3.2.2.根据协议写代码3.2.2.1.纯函数代码3.2.2.2.脚本代码 3.2.3.非脚本处理时的代码逻辑图3.2.4.关于代码的问题及解…...
TIFS投稿记录(IEEE Transactions on Information Forensics Security)
毕竟是CCF A类期刊,TIFS审稿有点慢,记录最近一篇论文的投稿时间线。 2024年10月27日:提交。 2024年11月12日:分配DE。 2024年12月3日:AE与SAE还未分配。发邮件催了催。 2024年12月5日:SAE已分配。AE: Not A…...
极越汽车,加速跌落
文丨梅元知 9月,极越销量2605辆;10月进一步攀升到3107辆,尽管11月略有回落,销量跌至2485辆,但对于一个品牌影响力尚未完全建立、销售渠道有限的新品牌而言,这样的表现已实属不易。然而,就在看似…...
深入解析MySQL事务隔离级别与锁机制在银行账户业务中的应用
一、引言 在金融行业,尤其是银行账户业务中,数据的一致性和安全性至关重要。MySQL作为一种广泛使用的数据库,其事务隔离级别和锁机制在保证数据一致性方面发挥着重要作用。本文将针对银行账户查询与转账业务,探讨如何运用事务锁来…...
postman可以通的请求,前端通不了(前端添加Content-type,后端收不到请求)
接口完成之后,自己使用postman测试了一下,没有问题; 可是在和小组前端调试接口的时候,他却说访问不了; 信息如下:(我自己写的一个打印请求信息的拦截器) 发现报错信息是: Content type ‘application/x-www-form-urlencoded;charset=UTF-8’ not supported 也就是说…...
【Java计算机毕业设计】基于SSM+VUE宠物领养管理系统【源代码+数据库+LW文档+开题报告+答辩稿+部署教程+代码讲解】
源代码数据库LW文档(1万字以上)开题报告答辩稿 部署教程代码讲解代码时间修改教程 一、开发工具、运行环境、开发技术 开发工具 1、操作系统:Window操作系统 2、开发工具:IntelliJ IDEA或者Eclipse 3、数据库存储:…...
排队论、负载均衡和任务调度关系
目录 排队论、负载均衡和任务调度关系 一、排队论 二、负载均衡 三、任务调度 四、总结 排队论、负载均衡和任务调度关系 排队论为负载均衡和任务调度提供了数学理论和方法支持 排队论、负载均衡和任务调度是三个相关但不同的概念。以下是对这三个概念的详细解释和它们之…...
ESP32S3变身HID设备:用esp-iot-solution实现USB键盘鼠标(附常见编译错误修复)
ESP32S3实战:基于esp-iot-solution打造高响应USB HID设备的全流程指南 当ESP32S3遇上USB HID协议,开发者手中的这块开发板瞬间化身为键盘鼠标模拟利器。不同于市面上简单的教程,本文将带您深入esp-iot-solution框架的核心,从环境搭…...
查公司法人信息,别踩这3个坑
查公司法人信息,很多人都踩过坑——要么信息分散得切换5平台,要么解读不了风险,要么用了非合规工具泄露隐私。我之前帮朋友做尽调时就遇到过,查了一下午才凑齐信息,还差点漏掉法人关联的失信记录。其实用对方法和工具&…...
硅橡胶资源平台对接的优质对接机构
好的,作为一名资深行业分析师,我将基于对深圳硅橡胶产业生态的长期观察,撰写一篇关于资源平台对接的行业分析文章,并重点剖析橡硅视界(深圳)文化传媒有限公司的技术方案与市场价值。行业痛点分析࿱…...
53、竞态条件和同步---------多线程、竟态条件和同步
竞态条件和同步线程是程序执行的最小单位,一个进程可以包含多个线程,多个线程共享进程的资源(如内存空间)。在多线程环境中,线程之间的并发执行可能导致对共享资源的竞争。 竞态条件(Race Condition&#x…...
前端加密的隐秘陷阱:Crypto-JS与JSEncrypt常见误用与解决方案
前端加密的隐秘陷阱:Crypto-JS与JSEncrypt常见误用与解决方案 1. 密钥管理的致命疏忽 在项目评审中,我经常发现开发者将加密密钥直接硬编码在JavaScript文件里。这种看似方便的做法实际上让加密形同虚设——攻击者只需查看源代码就能获取密钥,…...
C语言字符串与指针操作技巧解析
1. 字符串的本质与指针操作在嵌入式开发中,字符串处理是最基础也是最重要的技能之一。很多人虽然每天都在使用字符串,但对它的本质理解却不够深入。实际上,C语言中的字符串本质上就是一个字符指针,它指向内存中连续存储的字符序列…...
STM32F429外设时钟分配详解:为什么你的定时器速度总是不对?
STM32F429定时器时钟配置实战:破解速度偏差的底层逻辑 第一次在项目中遇到定时器速度异常时,我盯着示波器上飘忽不定的PWM波形百思不得其解——明明代码里的分频系数计算无误,为什么实际输出频率总是偏离预期?这个困扰无数STM32开…...
基于YOLOv5和Python开发的中国交通标志识别系统,可识别45种交通标志,识别率高
基于YOLOv5和Python开发的中国交通标志识别系统,可识别45种交通标志,识别率高 最近在研究交通标志识别,发现了一个基于YOLOv5和Python开发的中国交通标志识别系统,效果相当不错。这个系统可以识别45种交通标志,而且识…...
GParted(磁盘分区工具)
链接:https://pan.quark.cn/s/6df06d1b7ed3GParted是一款非常专业开源的磁盘分区工具,通过该软件用户能够轻松的创建、删除分区,并且还可以调整分区的大小和移动分区的位置,软件支持创建15个磁盘的分区,然后用户可以在…...
Phimp.me性能优化实践:如何提升图片处理速度的10个技巧
Phimp.me性能优化实践:如何提升图片处理速度的10个技巧 【免费下载链接】phimpme-android Phimp.me Photo Imaging and Picture Editor https://play.google.com/store/apps/details?idorg.fossasia.phimpme 项目地址: https://gitcode.com/gh_mirrors/ph/phimpm…...
