C++ 基础
命名空间
在 C/C++ 中,变量、函数和类都是大量存在的,这些变量、函数和类的名称将都存在全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace 关键字的出现就是针对这种问题的。
定义
定义命名空间,需要使用到 namespace 关键字,后面跟命名空间的名字,然后接一对 {} 即可,{} 中即为命名空间的成员。
- 命名空间中可以定义变量/函数/类
- 命名空间可以嵌套
- 同一个工程中允许存在多个相同名称的命名空间,编译器会合成为一个命名空间
注意:一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中。
使用方式
-
加命名空间名称及作用域限定符
-
使用 using 将命名空间中成员引入
-
使用 using namespace 命名空间名称引入
// 分别对应上面三种方式
// 1. std::cin
// 2. using std::cin
// 3. using namespce std
缺省参数
缺省参数是声明或定义函数时为函数的参数指定一个默认值。在调用该函数时,如果没有指定实参则采用该默认值,否则使用指定的实参。
分类
- 全缺省参数
- 半缺省参数
// 分别对应上面两种形式
// 1. void test1(int a = 1, int b = 2, int c = 3)
// 2. void test2(int a, int b = 2, int c = 3)
注意:
- 半缺省参数必须从右往左依次给出,不能间隔
- 一旦某个参数被赋予了默认值,它后面的所有参数都必须有默认值
- 缺省参数不能在函数声明和定义中同时出现
- 在给定的作用域中一个形参只能被赋予一次默认实参
- 局部变量不能作为默认实参
- 除此之外,只要表达式的类型能转化成形参所需的类型,该表达式就能作为默认实参
- 用作默认实参的名字在函数声明所在的作用域解析,而这些名字的求值过程发生在函数调用时
// 多次声明同一个函数,为其不同参数添加默认值是合法的,但是不推荐
void test(int a, int b = 2, int c = 3);
void test(int a = 1, int b, int c);
函数重载
自然语言中,一个词可以有多重含义,人们可以通过上下文来判断该词真实的含义,即该词被重载了。
概念
函数重载:是函数的一种特殊情况,C++ 允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数或类型或顺序)不同,返回值不作要求,常用来处理实现功能类似数据类型不同的问题。
重载示例:
int Add(int left, int right);
long Add(long left, long right);
double Add(double left, double right);
Name Mangling
C
早期 Unix 下的 C 语言因为历史原因规定,C 语言源代码文件中的所有全局变量和函数经过编译以后,相对应的符号前加上下划线 _
。在现在 Linux 下的 GCC 编译器中,默认情况已经去掉了在 C 语言符号前面加下划线的方式,而是直接使用函数名。
C 语言不支持函数重载,因为 C 语言直接使用函数名去表示和查找,而重载函数函数名相同。编译的时候,两个函数名相同的函数,在符号表中存在歧义和冲突,其在链接的时候也存在歧义和冲突。
C++
C++ 的目标文件符号表中不是直接用函数名来标识和查找函数。
g++ 的函数名修饰规则:
- 所有的符号都以
_Z
开头,对于嵌套的名字(在名称空间或在类里面的),后面紧跟 N,然后是各个名称空间和类的名字,每个名字前是名字字符串长度,再以 E 结尾 - 对于一个函数来说,它的参数列表紧跟在函数名 或 E 后面
- 全局变量和静态变量也有同样的机制,不过修饰并没有使用变量类型
有了函数名修饰规则,只要参数列表不同,符号表存储的修饰后的函数名就不同,也就不存在二义性和冲突了。
extern “C”
有时候在 C++ 工程中可能需要将某些函数按照 C 的风格来编译,在函数前加 extern “C”,意思是告诉编译器,将该函数按照 C 语言规则来编译。
那么 C 语言的项目可以使用 C++ 编写的库吗?
是可以的,库是一种二进制文件,只要能够找到相应的函数就可以使用。若有函数重载的话,是没办法使用的。
引用
概念
引用不是新定义一个变量,而是给已存在变量取一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。
语法:类型& 引用变量名 = 引用实体
int a = 10;
int& ra = a;
引用类型必须和引用实体是同种类型的。
特性
- 引用在定义时必须初始化
- 一个变量可以有多个引用
- 引用一旦引用一个实体,再不能引用其他实体
使用场景
- 做参数(提高效率,形参的改变可以影响实参)
- 做返回值(提高效率,修改返回变量)
注意:如果函数返回时,出了函数作用域,如果返回对象还未还给系统,则可以使用引用返回,如果已经还给系统了,则必须使用传值返回。
传值和传引用效率比较
以值作为参数或返回值类型,在函数传参/返回时,不会直接传递实参/将变量本身直接返回,而是传递/返回一份变量的临时的拷贝,因此用值作为参数/返回值类型,效率是非常低下的,尤其是当参数或者返回值类型非常大时。
指针和引用的区别
在语法概念上引用就是一个别名,没有独立空间,和其引用体公用一块空间。
在底层实现上实际是有空间的,引用是按照指针的方式来实现的。
引用和指针的不同点:
- 引用在定义时必须初始化,指针没有要求
- 引用在初始化时绑定一个实体后,就不能再绑定其他实体,而指针可以改变指向
- 没有 NULL 引用,但有 NULL 指针
- 在 sizeof 中含义不同:引用结果为引用类型的大小,但指针始终是指针类型所占字节个数
- 有多级指针,但是没有多级引用
- 访问实体方式不同,指针需要显式解引用,引用编译器自己处理
内敛函数
概念
以 inline 修饰的函数叫做内联函数,编译时 C++ 编译器会在调用内联函数的地方展开,没有函数压栈的开销,内联函数可以提升程序运行的效率。
特性
- inline 是一种以空间换时间的做法,省去调用函数额开销,增加了内存和磁盘占用,所以代码很长或者有循环/递归的函数不适宜使用作为内联函数
- inline 对于编译器而言只是一个请求,编译器会自动优化,如果定义为 inline 的函数体内有循环/递归等等,编译器优化时会忽略掉内联请求
- inline 不能将声明和定义分离,分离会导致链接错误
功能
宏的优点:
- 增强代码的复用性
- 提高性能
宏的缺点:
- 不方便调试宏(预处理阶段进行了替换)
- 导致代码可读性差,可维护性差,容易误用
- 没有类型安全的检查
函数定义换用内联函数
- 在类内定义的成员函数会默认加上内敛(隐式内敛)
- 内敛声明定义必须一起,否则不起作用
常量定义换用 const
C++ 中被 const 修饰的变量:编译器看到变量被 const 修饰,默认其不会改变,若后面有用到该变量会将其值放入寄存器中,使用时直接读取寄存器中数据,而不是到内存中读取。
-
编译器一般不会为整数型 const 对象在内存中开辟空间,除非指针或引用等必须用它的地址的情况
-
可以用 volatile 修饰该变量,让每次取值都必须到内存中读取
#include <iostream>
using namespace std;int main() {// volatile const int a = 10;const int a = 10;int* p = (int*)(&a);*p = 20;// 此时打印 a 的值是 10, *p 的值是 20cout << a << " " << *p << endl;return 0;
}
constexpr
常量表达式(const expression)是指值不会改变并且在编译过程就能得到计算结果的表达式。
一个对象(或表达式)是不是常量表达式由它的数据类型和初始值共同决定,例如:
const int num1 = 1230; // num1 是常量表达式
const int num2 = num1 + 1; // num2 是常量表达式
int num3 = 1002; // num3 不是常量表达式
const int num4 = GetNum(); // num4 不是常量表达式
尽管 num3 的初始值是个字面值常量,但由于它的数据类型只是普通的 int 而非 const int,所以它不属于常量表达式。另一方面,尽管 num4 本身是一个常量,但它的具体值直到运行时才能获取到,所以也不是常量表达式。
constexpr 变量
C++ 11 新标准规定,允许将变量声明为 constexpr 类型以便编译器来验证变量的值是否是一个常量表达式。声明为 constexpr 的变量一定是一个常量,而且必须用常量表达式初始化。
constexpr int num1 = 1230; // 1230 是常量表达式
constexpr int num2 = num1 + 1; // num1 + 1 是常量表达式
constexpr int num3 = GetNum(); // 只有当 GetNum 是一个 constexpr 函数时,才是一条正确的声明语句
指针和引用都能定义成 constexpr,但它们的初始值却受到严格的限制。一个 constexpr 指针的初始值必须是 nullptr 或 0,或者是存储于某个固定地址中的对象。
- 固定地址:函数体外定义的对象(全局对象)、static 修饰的对象
- constexpr 修饰指针,只限定指针的指向不能更改,对指向空间的值不作限制
constexpr 函数
constexpr 函数(constexpr function)是指能用于常量表达式的函数。
需要遵守两个约定:
- 函数的返回类型及所有形参的类型都得是字面值类型
- 函数体中必须有且只有一条 return 语句
执行初始化任务时,编译器把 constexpr 函数的调用替换成其结果值。为了能在编译过程中随时展开,constexpr 函数被隐式地指定为内敛函数。constexpr 函数体内也可以包含其他语句,只要这些语句在运行时不执行任何操作就行。例如,空语句、类型别名以及 using 声明。
nullptr
由于 C++ 中 NULL 被定义成字面量 0,这样就可能回带来一些问题,因为 0 既能指针常量,又能表示整形常量。所以出于清晰和安全的角度考虑,C++11 中新增了 nullptr,用于表示空指针。
//stddef.h
#ifndef NULL#ifdef __cplusplus#define NULL 0#else#define NULL ((void *)0)#endif
#endif
注意:
- 在使用 nullptr 时,不需要包含头文件,因为 nullptr 是 C++11 新增的关键字
- 在 C++11 中,
sizeof(nullptr)
与sizeof((void*)0)
所占的字节数相同 - 为了提高代码的健壮性,在表示指针空值时建议使用 nullptr
相关文章:
C++ 基础
命名空间 在 C/C 中,变量、函数和类都是大量存在的,这些变量、函数和类的名称将都存在全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace 关键字的…...
[golang gin框架] 2.Gin HTML模板渲染以及模板语法,自定义模板函数,静态文件服务
一.Gin HTML 模板渲染全部模板放在一个目录里面的配置方法首先在项目根目录新建 templates 文件夹,然后在文件夹中新建 对应的index.html<!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta http…...
数据仓库层Repository(CrudRepository、PagingAndSortingRepository、JpaRepository)
什么是数据仓库层Repository? 数据仓库接口的作用:Repository原意指的是仓库,即数据仓库的意思。Repository居于业务层和数据层之间,将两者隔离开来,在它的内部封装了数据查询和存储的逻辑。 Repository接口ÿ…...
大数据技术架构(组件)33——Spark:Spark SQL--Join Type
2.2.2、Join Type2.2.2.1、Broadcast Hash Join (Not Shuffled)就是常说的MapJoin,join操作在map端进行的。场景:join的其中一张表要很小,可以放到Driver或者Executor端的内存中。原理:1、将小表的数据广播到所有的Executor端,利用collect算子…...
Linux: bash起后台进程引发的僵尸进程
1. 前言 限于作者能力水平,本文可能存在谬误,因此而给读者带来的损失,作者不做任何承诺。 2. 案例 原来的故事是 这样 的,感兴趣的读者可以直接前往。我从中截取了一段重现故事中问题的代码(对原代码做了小小调整&a…...
网络安全攻防中,Rock-ON自动化的多功能网络侦查工具,Burpsuite被动扫描流量转发
网络安全攻防中,Rock-ON自动化的多功能网络侦查工具,Burpsuite被动扫描流量转发。 #################### 免责声明:工具本身并无好坏,希望大家以遵守《网络安全法》相关法律为前提来使用该工具,支持研究学习ÿ…...
电子技术——共模抑制
电子技术——共模抑制 我们在之前学习过,无论是MOS还是BJT的差分输入对,共模信号并不会改变漏极电流的大小,因此我们说差分输入对共模信号无响应。但是实际上由于各种客观非理想因素,例如电流源有限阻抗等,此时共模是影…...
对KMP简单的理解
声明:下边的例子均表示下标从1开始的数组 ne数组的定义: next[i] 就是使子串 s[1…i] 有最长相等前后缀的前缀的最后一位的下标。ne[i]也可以表示相等子串的长度 准备执行jne[j]时, 表示当前s[i]!p[j1] , 如果ne[j]1 ,那么下…...
Hibernate不是过时了么?SpringDataJpa又是什么?和Mybatis有什么区别?
一、前言 ps: 大三下学期,拿到了一份实习。进入公司后发现用到的技术栈有Spring Data Jpa\Hibernate,但对于持久层框架我只接触了Mybatis\Mybatis-Plus,所以就来学习一下Spring Data Jpa。 1.回顾MyBatis 来自官方文档的介绍:MyBatis 是一款…...
数学建模拓展内容:卡方检验和Fisher精确性检验(附有SPSS使用步骤)
卡方检验和Fisher精确性检验卡方拟合度检验卡方独立性检验卡方检验的前提假设Fisher精确性检验卡方拟合度检验 卡方拟合度检验概要:卡方拟合度检验也被称为单因素卡方检验,用于检验一个分类变量的预期频率和观察到的频率之间是否存在显著差异。 卡方拟…...
【Python学习笔记之七大数据类型】
Python数据类型:Number数字、Boolean布尔值、String字符串、list列表、tuple元组、set集合、dictionary字典 int整数 a1 print(a,type(a))float浮点数 b1.1 print(b,type(b))complex复数 c100.5j print(c,type(c))bool布尔值:True、False,true和false并非Python…...
Android系统之onFirstRef自动调用原理
前言:抽丝剥茧探究onFirstRef究竟为何在初始化sp<xxx>第一个调用?1.onFirstRef调用位置<1>.system/core/libutils/RefBase.cpp#include <utils/RefBase.h>//1.初始化强指针 void RefBase::incStrong(const void* id) const {weakref_i…...
ipv6上网配置
一般现在的宽带都已经支持ipv6了,但是需要一些配置才能真正用上ipv6。记录一下配置过程。 当前测试环境为移动宽带,光猫下面接了一个路由器,家里所有的设备都挂到这个路由器下面的。 1. 光猫改桥接 光猫在使用路由模式下,ipv6无…...
python实现聚类技术—复杂网络社团检测 附完整代码
实验内容 某跆拳道俱乐部数据由 34 个节点组成,由于管理上的分歧,俱乐部要分解成两个社团。 该实验的任务即:要求我们在给定的复杂网络上检测出两个社团。 分析与设计 实验思路分析如下: 聚类算法通常可以描述为用相似度来衡量两个数据的远近,搜索可能的划分方案,使得目标…...
如何判断两架飞机在汇聚飞行?(如何计算两架飞机的航向夹角?)内含程序源码
ok,在开始一切之前,让我先猜一猜,你是不是想百度“二维平面下如何计算两个移动物体的航向夹角?”如果是,那就请继续往下看。 首先,我们要明确一个概念:航向角≠航向夹角!࿰…...
Scipy稀疏矩阵bsr_array
文章目录基本原理初始化内置方法基本原理 bsr,即Block Sparse Row,bsr_array即块稀疏行矩阵,顾名思义就是将稀疏矩阵分割成一个个非0的子块,然后对这些子块进行存储。通过输入维度,可以创建一个空的bsr数组࿰…...
LeetCode笔记:Weekly Contest 332
LeetCode笔记:Weekly Contest 332 1. 题目一 1. 解题思路2. 代码实现 2. 题目二 1. 解题思路2. 代码实现 3. 题目三 1. 解题思路2. 代码实现 4. 题目四 1. 解题思路2. 代码实现 比赛链接:https://leetcode.com/contest/weekly-contest-332/ 1. 题目一…...
autox.js在vscode(win7)与雷神模拟器上的开发环境配置
目录 下载autox.js 安装autox.js? 在电脑上搭建autox.js开发环境 安装vscode 安装autox.js插件 雷神模拟器连接vscode 设置雷神模拟器IP 设置autox.js应用IP地址等 下载autox.js 大体来说,就是一个运行在Android平台上的JavaScript 运行环境 和…...
创建阿里云物联网平台
创建阿里云物联网平台 对云平台设备创建过程做记录,懒得再看视频 文章参考视频:https://www.bilibili.com/video/BV1jP4y1E7TJ?p26&vd_source50694678ae937a743c59db6b5ff46c31 阿里云:https://www.aliyun.com 1.物联网平…...
【链式二叉树】数据结构链式二叉树的(万字详解)
前言: 在上一篇博客中,我们已经详解学习了堆的基本知识,今天带大家进入的是二叉树的另外一种存储方式----“链式二叉树”的学习,主要用到的就是“递归思想”!! 本文目录1.链式二叉树的实现1.1前置说明1.2结…...
Koa2篇-简单介绍及使用
一.简介koa2是基于 Node.js 平台的下一代 web 开发框架, 致力于成为一个更小、更富有表现力、更健壮的 Web 框架。 可以避免异步嵌套. express中间件是异步回调,Koa2原生支持async/await二.async/awaitconst { rejects } require("assert"); const { resolve } req…...
Linux ALSA 之十一:ALSA ASOC Path 完整路径追踪
ALSA ASOC Path 完整路径追踪一、ASoc Path 简介二、ASoc Path 完整路径2.1 tinymix 设置2.2 完整路径 route一、ASoc Path 简介 如前面小节所描述,ASoc 中 Machine Driver 是 platform driver 和 codec driver 的粘合剂,audio path 离不开 FE/BE/DAI l…...
【Spring Cloud总结】1、服务提供者与服务消费者快速上手
目录 文件结构 代码 1、api 1.1实体类(Dept ) 1.2数据库 2、provider 2.1 DeptController 2.2 DeptDao 2.3 DeptService 2.4 DeptServiceImpl 2.5 application.yml 3、consumer 3.1 ConfigBean 3.2 DeptConsumerController 测试 1.启动…...
若依项目学习之登录生成验证码
若依项目学习之登录生成验证码 使用DefaultKaptcha生成验证码 /*** 验证码配置* * author ruoyi*/ Configuration public class CaptchaConfig {/*** 生成字符类型的验证码**/Bean(name "captchaProducer")public DefaultKaptcha getKaptchaBean(){DefaultKaptcha…...
计算机网络5:数据在两台计算机之间是怎样传输的?
数据在两台计算机之间的传输总的来说包括了封装和解封两个过程 封装(5层协议) 以传送一张图片为例 **应用层:**将jpg格式的图片数据转化成计算机可以识别的0101的二进制的比特流 **传输层:**将应用层传输下来的数据进行分段&…...
就现在!为元宇宙和Web3对互联网的改造做准备!
欢迎来到Hubbleverse 🌍 关注我们 关注宇宙新鲜事 📌 预计阅读时长:8分钟 本文仅代表作者个人观点,不代表平台意见,不构成投资建议。 如今,互联网是各种不同的网站、应用程序和平台的集合。由于彼此分离…...
【mysql数据库】
目录SQL数据库分页聚合函数表跟表之间的关联关系SQL中怎么将行转成列SQL注入将一张表的部分数据更新到另一张表WHERE和HAVING的区别索引索引分类如何创建及保存MySQL的索引?怎么判断要不要加索引?索引设计原理只要创建了索引,就一定会走索引吗…...
【测试开发】web 自动化测试 --- selenium4
目录1. 什么是自动化为什么要做自动化2. 为什么选择selenium作为我使用的web自动化工具3. 什么是驱动?驱动的工作原理是什么5. 第一个自动化程序演示6. selenium基本语法6.1 定位元素的方法6.2 操作页面元素6.3 等待6.4 信息打印获取当前页面句柄,窗口切…...
Elasticsearch7.8.0版本进阶——路由计算
目录一、路由计算1.1、路由计算的前提理解1.2、路由计算的概述1.3、路由计算的概述一、路由计算 1.1、路由计算的前提理解 当索引一个文档的时候,文档会被存储到一个主分片中。Elasticsearch 如何知道一个文档应该存放到哪个分片中呢?当我们创建文档时…...
c#反射-获取属性和字段的值
演示类 示例类具有一个私有实例字段,一个实例属性,一个实例字段,一个静态私有属性。 class Fight {private int hp;public int Hp{get > hp; set{if (value > 0){ hp value; }else if (-value > Def){ hp value - Def; }}}publi…...
网站怎么防k/三台网站seo
有没有一种,情况: 1. 程序A打开了文件管理器; 2. 程序B又打开了文件管理器; 导致开了两个文件管理器,太不舒服了; 搜索下 kubuntu dolphin single instance,果然找到了解决方法: 文件…...
东莞做网站优化/百度投诉平台在哪里投诉
1.边角热区 新版Win8取消了开始菜单,但用鼠标点击左下角时仍可进入Metro界面,其实剩余的几个角也都有着类似功用。比如左上角代表在打开的Metro应用间循环切换、右上角代表可以一键激活Charm工具栏、左下角是Metro与传统桌面的切换键,至于右下…...
javaweb做视频网站难吗/百度搜索下载app
终端命令 启动MongoDB服务: sudo mongod 报出如下错误,表示默认的存储数据目录 /data/db 不存在: [initandlisten] exception in initAndListen: 29 Data directory /data/db not found., terminating 解决方法: 创建 /data目…...
网站 app开发 财务做帐/seo一个关键词多少钱
len 获取容器类型的元素个数, 或者说获取容器的长度 str1 123 list1 [1, 2, 3] tuple1 (1, 2, 3) set1 {1, 2, 3} dict1 {name: 123, age: 18} 使用len可以获取list str tuple set中的元素个数 print(len(str1)) print(len(list1)) print(len(tuple1)) print(len(set1)…...
网站的目录怎样做的/关键词优化公司哪家强
旋转图像前言一、旋转图像二、逻辑分析逻辑整理总结参考文献前言 旋转图像,即旋转矩阵,通过不断将覆盖值记录,从而达到不覆盖的目的。 核心问题对应核心方案。 一、旋转图像 二、逻辑分析逻辑整理 package everyday;// 旋转图像。 public …...
基础型网站价格/湖北seo网站推广
汽车电脑板的维修注意事项哈尔滨工程大学 于栋国现代进口轿车上各部的控制系统都已采用电子控制。如发动机燃油喷射、自动变速、车身控制、ABS等等。这些控制中心俗称电脑。目前很多修配厂的技术水平同前些年相比都都有很大的提高,对于电脑的故障判断都比较准确&…...