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、数据库存储:…...
排队论、负载均衡和任务调度关系
目录 排队论、负载均衡和任务调度关系 一、排队论 二、负载均衡 三、任务调度 四、总结 排队论、负载均衡和任务调度关系 排队论为负载均衡和任务调度提供了数学理论和方法支持 排队论、负载均衡和任务调度是三个相关但不同的概念。以下是对这三个概念的详细解释和它们之…...
TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...
Objective-C常用命名规范总结
【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...
第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...
pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)
目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关࿰…...
Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...
【Go语言基础【13】】函数、闭包、方法
文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数(函数作为参数、返回值) 三、匿名函数与闭包1. 匿名函数(Lambda函…...
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要: 近期,在使用较新版本的OpenSSH客户端连接老旧SSH服务器时,会遇到 "no matching key exchange method found", "n…...
uniapp 小程序 学习(一)
利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 :开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置,将微信开发者工具放入到Hbuilder中, 打开后出现 如下 bug 解…...
