C/C++(二)C++入门基础
这一章会介绍C++入门必须掌握的一些基础概念。
一、函数重载
1、什么是函数重载?
函数重载是C++相比于C语言的一个重大改进。
即C++允许在同一作用域内声明多个功能类似的同名函数,这些函数的参数类型 / 个数 / 类型顺序不同。(注:返回值不同不能构成重载,这是由后文会介绍的函数名修饰规则所决定)
2、C++如何支持函数重载的?(Linux g++编译器环境下)
在C/C++(一)中介绍了,在C / C++中,想要形成一个可执行程序,必须经历 预处理 --> 编译 --> 汇编 --> 链接 四个阶段。
在编译阶段,g++ 编译器会根据其函数名修饰规则(_Z + 函数长度 + 函数名 + 函数参数类型的首字母)(可以发现,修饰规则中没有返回值,因此返回值不同,不能构成函数重载)对函数进行修饰,根据其规则可以看出,函数参数不同,实际上在编译阶段会被修饰成不同的函数。这也就是C++支持函数重载的根基。
示例代码:
#include <iostream> using namespace std;int add(int x, int y) {return x + y; } int add(int x, int y, int z) {return x + y + z; } int main() {int res1 = add(1, 2);int res2 = add(1, 2, 3); }
3、为什么C语言不支持函数重载,C++支持?
因为C语言的编译器的函数名修饰规则并不会修饰函数名,而是按照原先函数名。
二、引用和指针
1、什么是引用?
引用是给已经存在的变量取别名, 编译器不会为引用开辟空间,引用和其引用的变量共用同一块内存空间。
使用格式:
类型& 引用变量名(对象名) = 引用实体
1.1 有关引用的一些注意事项
1、& 跟在类型和变量名之间,叫做引用。否则,叫做取地址。
2、引用必须在定义时就初始化。
3、一个变量可以有多个引用,引用本身也可以有引用。
4、引用一旦引用了一个实体,就不能再引用其它实体。
5、非常量应用不能绑定到常量对象 / 临时常量对象 /不同类型的对象;常量引用可以绑定到 常量对象、临时常量对象或不同类型的对象(需要显式类型转换)。
1.2 常引用(常量引用 / const 引用)
常引用是引用的一种特殊形态,允许引用一个对象,可以绑定到常量对象 / 临时常量对象 / 不同类型的对象(需要显式类型转换),但是不能通过该引用修改对象的值,主要用途是提高代码的安全性和可读性。
示例代码:
void TestConstRef() {const int a = 10;// int& ra = a; // 该语句编译时会出错,a为常量,普通引用不能绑定常量对象const int& ra = a; // 正确方法// int& b = 10; // 该语句编译时会出错,10为临时常量,const int& b = 10; // 正确方法double d = 12.34;//int& rd = d; // 该语句编译时会出错,类型不匹配(具体原因是由于类型转换时会产生临时变 // 量,而临时变量具有常性造成无法引用)const int& rd = static_cast<int>(d); // 正确方法1double& rd = d // 正确方法2 }
2、指针和引用的区别(用法 + 底层原理)
1、引用是定义一个变量的别名,与这个变量共用同一内存空间,大小也与这个变量的大小 相同;而指针存储的是变量的地址,需要额外占用一小段空间储存,大小也始终是指针 的大小。(32位下是4字节、64位下是8字节)
2、引用必须在声明的时候就进行初始化,不能为空,并且一旦初始化就不能改变引用的对 象(因为要让编译器知道,引用总是指向这个有效的对象,以便生成更高效的代码, 直接访问目标变量的内存地址,而不需要额外的解引用操作);指针由于通过解引用显 式访问变量,所以可以在声明的时候不初始化,也可以随时改变指向的对象。
3、引用++就相当于其引用的变量++;指针则是指针指向下一个内存地址。
4、引用访问绑定的实体,直接访问,由编译器来优化;而指针需要解引用。
5、因为引用不能为空 + 编译器优化,引用比指针更安全。
3、引用的两大使用场景
三、宏的替代方案
宏作为从C语言继承而来的概念(C / C++(一)中有详细介绍),其有着一定的优点(代码复用性强;可以提高性能),但是其缺点更多(由于预编译阶段进行了替换,宏不方便调试;代码的可读性较差,可维护性也不好,还容易误用;也没有类型安全的检查)
所以C++提供了三种用来替代宏的方案
替代宏定义标识符:const变量 / enum枚举
替代宏函数:inline内联函数
1、const变量替代宏定义标识符
// 宏定义标识符 #define PI 3.14159// const变量定义 const double PI = 3.14159;
优点:
1、类型安全:const 变量具有明确的类型,编译器可以进行类型检查,避免类型错误。
2、调试友好:
const
变量在调试器中可以显示其值和类型,便于调试。3、作用域控制:
const
变量可以有局部作用域,而宏定义在整个文件范围内有效,容易引起 命名冲突。
2、enum枚举替代宏定义标识符
// 宏定义标识符 #define RED 0 #define GREEN 1 #define BLUE 2// 枚举定义标识符 enum Color {RED,GREEN,BLUE };
优点:
1、类型安全:
enum
类型的变量只能取枚举值,方便编译器进行类型检查。2、语义清晰:
enum
明确表示一组相关的常量,代码更具可读性。3、范围限制:枚举值在编译时有固定的范围,避免了非法值的赋值。
3、inline 内联函数替代宏函数
3.1 什么是内联函数?
以 inline 关键字修饰的函数叫做内联函数,
特性:在编译的时候,C++编译器会在调用内联函数的地方直接用函数体替换,没有调用普 通函数需要建立栈帧的额外开销,可以提升程序运行的效率。
缺点:以空间换时间,可能会导致目标文件变大。(因此,内联 inline 关键字实际上只是向 编译器发出的一个内联请求,编译器会自己决定是否把这个函数设置为内联函数,如 果函数过长,编译器将忽略内联请求)
使用建议:
1、函数规模较小、不是递归,调用不频繁的函数,可以采用 inline 内联修饰;其它 的不建议;
2、同时也不建议内联函数的声明与定义分离,因为分离了,每个cpp文件里都会有内联函数 的内联展开,链接器会发现不同的对象文件中都有这个内联函数的定义。无法确定应该 使用哪个定义,导致多重定义错误。(如果一定要使用,内联函数的声明和定义必须放 在同一个地方,通常是头文件中,确保每个编译单元都能看到完整的内联函数定义)
3.2 以内联函数替代宏函数
#define MAX(a, b) ((a) > (b) ? (a) : (b))
// #define 定义宏 #define MAX(a, b) ((a) > (b) ? (a) : (b))// inline内联函数代替宏函数 inline int max(int a, int b) {return (a > b) ? a : b; }
优点:
1、类型安全:
inline
函数具有明确的参数类型和返回类型,编译器可以进行类型检查。2、副作用避免:宏定义在参数计算上有潜在的副作用,而
inline
函数没有这个问题。3、调试友好:
inline
函数在调试器中可以显示调用栈和局部变量,而宏定义则不行。4、代码可读性:
inline
函数的代码更具可读性和可维护性。
四、新的空指针表示方式:nullptr
nullptr是C++11引入的一种新的空指针表示方式。在C++11中,sizeof(nullptr) 与 sizeof((void*)0)所占的字节数相同。
在传统的C语言 / C++98标准中,空指针的表示方式一般是NULL,而NULL的定义存在缺陷。
NULL的缺陷
NULL在在 C++ 中,通常定义为
0
或(void*)0
,这可能导致一些意外的行为:void f(int) {cout<<"f(int)"<<endl; } void f(int*) {cout<<"f(int*)"<<endl; } int main() {f(0);f(NULL);f((int*)NULL);return 0; }
这段代码的本意是希望想通过 f(NULL) 调用指针版本的 f(int*) 函数,但是由于NULL被定义成0,因此与程序的初衷相悖。
在C++98中,字面常量0既可以是一个整形数字,也可以是无类型的指针(void*)常量,但是编译器默认情况下将其看成是一个整形常量,如果要将其按照指针方式来使用,还必须对其进行强转 (void *)0。
nullptr的优势
1、类型安全:
nullptr
是一个类型,避免了与整数类型的隐式转换。2、更好的可读性:
nullptr
明确表示这是一个空指针,且不需要包含其它头文件。3、兼容性更好:
nullptr
可以更好地与模板一起使用。4、避免宏定义的问题:
nullptr
是一个关键字,不会受到宏定义的影响。5、支持
nullptr
类型的检查:可以使用std::nullptr_t
类型进行类型检查。因此为了提高代码的健壮性,在后续表示指针空值时建议最好使用 nullptr。
相关文章:

C/C++(二)C++入门基础
这一章会介绍C入门必须掌握的一些基础概念。 一、函数重载 1、什么是函数重载? 函数重载是C相比于C语言的一个重大改进。 即C允许在同一作用域内声明多个功能类似的同名函数,这些函数的参数类型 / 个数 / 类型顺序不同。(注:返回…...
人工智能发展:一场从“被教导”到“自我成长”的奇妙冒险
说到人工智能(AI),大家的第一反应往往是机器人、无人驾驶、或者那个让人害怕的AI会不会取代人类。其实,AI的进化过程简直像一部精彩的电影,有起伏、有高潮、有让人摸不着头脑的时刻。今天,我们就一起来“吃…...

企业级 RAG 全链路优化关键技术
本文根据2024云栖大会实录整理而成,演讲信息如下: 演讲人: 邢少敏 | 阿里云智能集团高级技术专家 活动: 2024 云栖大会 - AI 搜索企业级 RAG 全链路优化关键技术 在2024云栖大会上,阿里云 AI 搜索研发负责人之一的…...

学习文档(5)
Redis应用 目录 Redis应用 Redis 除了做缓存,还能做什么? Redis 可以做消息队列么? Redis 可以做搜索引擎么? 如何基于 Redis 实现延时任务? Redis 除了做缓存,还能做什么? 分布式锁&…...

node.js下载安装以及环境配置超详细教程【Windows版本】
node安装以及环境变量配置 Step1:选择版本进行安装Step2:安装Node.jsStep3:环境配置Step4:检查node.js是否成功安装Step5:npm修改下载镜像 Step1:选择版本进行安装 Node.js 安装包及源码下载地址为 Node.…...

08_实现 reactive
目录 编写 reactive 的函数签名处理对象的其他行为拦截 in 操作符拦截 for...in 循环delete 操作符 处理边界新旧值发生变化时才触发依赖的情况处理从原型上继承属性的情况处理一个对象已经是代理对象的情况处理一个原始对象已经被代理过一次之后的情况 浅响应与深响应代理数组…...
finereport 中台 帆软 编码解码
帆软用的 post 方式编码不是用的 dict,而是二次 url 编码,需要二次解析 import time import urllib.parse import json# 原始字符串 encoded_string data "__parameters__%7B%22MANUFACTURER%22%3A%22%22%2C%22CATEGORY%22%3A%22%22%2C%22HHPN_L…...
Day15-数据库服务全面优化与PT工具应用
Day15-数据库服务全面优化与PT工具应用 1、数据库服务优化讲解1.2 数据库服务系统层面的优化1.3 数据库服务软件版本选择1.4 数据库服务结构参数优化1.4.1 数据库连接层优化1.4.2 数据库服务层优化1.4.3 数据库引擎层优化1.4.4 数据库复制相关优化1.4.5 数据库其他相关优化 1.5…...

开源限流组件分析(二):uber-go/ratelimit
文章目录 本系列漏桶限流算法uber的漏桶算法使用mutex版本数据结构获取令牌松弛量 atomic版本数据结构获取令牌测试漏桶的松弛量 总结 本系列 开源限流组件分析(一):juju/ratelimit开源限流组件分析(二):u…...

探索 SVG 创作新维度:svgwrite 库揭秘
文章目录 **探索 SVG 创作新维度:svgwrite 库揭秘**背景介绍库简介安装指南基础函数使用实战场景常见问题与解决方案总结 探索 SVG 创作新维度:svgwrite 库揭秘 背景介绍 在数字艺术和网页设计领域,SVG(Scalable Vector Graphic…...
为什么要做PFAS测试?PFAS检测项目详细介绍
PFAS测试之所以重要,主要归因于PFAS(全氟和多氟化合物)的广泛存在、持久性、生物累积性和潜在的毒性。这些特性使得PFAS在环境和人体中可能长期存在,并对生态系统和人类健康构成威胁。以下是对PFAS检测项目的详细介绍以及进行PFAS…...

稀土阻燃协效剂的应用
稀土阻燃协效剂是一类利用稀土元素(如铈、镧、钕、铕等)具有的独特性质,来增强材料阻燃性能的化学物质。在聚合物材料燃烧时可催化酯花成碳,迅速在高分子表面形成致密连续的碳层,隔绝聚合物材料内部的可燃性气体与氮气…...
Java的异常处理
常见异常 ① 运行时异常 a、ClassNotFoundException b、FileNotFoundException c、IOException ② 编译时异常 a、ArrayIndexOutOfBoundsException b、NullPointerException c、ClassCastException d、InputFormatException e、InputMismatchException f、ArithmeticException …...

免费域名邮箱申请和使用教程:有哪些步骤?
免费域名邮箱设置指南?如何免费注册烽火域名邮箱? 对于个人和企业而言,拥有一个专属的域名邮箱不仅能提升专业形象,还能增强品牌识别度。烽火将详细介绍如何申请和使用免费域名邮箱,帮助您轻松拥有一个专属的电子邮件…...

Linux之实战命令45:swapon应用实例(七十九)
简介: CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布:《Android系统多媒体进阶实战》🚀 优质专栏: Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏: 多媒体系统工程师系列【…...

提升数据处理效率:TDengine S3 的最佳实践与应用
在当今数据驱动的时代,如何高效地存储与处理海量数据成为了企业面临的一大挑战。为了解决这一问题,我们在 TDengine 3.2.2.0 首次发布了企业级功能 S3 存储。这一功能经历多个版本的迭代与完善后,逐渐发展成为一个全面和高效的解决方案。 S3…...

高级算法设计与分析 学习笔记13 线性规划
注意是线性规划不是动态规划哦 好家伙,这不是凸优化吗? 凸优化标准形式: 先改成统一最大化(凸优化那边怎么是统一最小化?) 原来的x2正负无所谓,但我希望每个x都是有限制的,所以把它改…...

2024年11月软考中项应试技巧与机考注意事项!
软考中项的备考技巧 重点来了!这部分是我辛苦总结出来的备考技巧,都是我当年备考时逐渐整合出来的,绝对够用,赶紧跟我一起掌握吧! 1.基础知识 在学习时建议大家先跟着班课老师结合教材过一遍基础知识。强调跟着班课…...

网络编程中容易踩的坑罗列,谨记!
1、TCP没考虑粘包分包 TCP是面向连接的可靠协议,TCP是流式协议,创建TCP套接字的类型为SOCK_STREAM int sockfd socket(AF_INET, SOCK_STREAM, 0);很多同学面试时对书上的话背诵如流,在实际TCP编程中却没有处理粘包和分包的代码,以…...

SD-WAN:推动企业网络优化与发展
近年来,软件定义广域网(SD-WAN)逐渐成为众多企业的首选网络解决方案。这背后的原因是什么?接下来我们将深入探讨这一趋势。 在快速发展的通信技术领域,企业对高效、灵活且可扩展的网络架构需求愈发迫切。随着数据流量的…...

基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...

相机从app启动流程
一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...

k8s业务程序联调工具-KtConnect
概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...

图表类系列各种样式PPT模版分享
图标图表系列PPT模版,柱状图PPT模版,线状图PPT模版,折线图PPT模版,饼状图PPT模版,雷达图PPT模版,树状图PPT模版 图表类系列各种样式PPT模版分享:图表系列PPT模板https://pan.quark.cn/s/20d40aa…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)
本期内容并不是很难,相信大家会学的很愉快,当然对于有后端基础的朋友来说,本期内容更加容易了解,当然没有基础的也别担心,本期内容会详细解释有关内容 本期用到的软件:yakit(因为经过之前好多期…...
在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?
uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件,用于在原生应用中加载 HTML 页面: 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...
Java 二维码
Java 二维码 **技术:**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...

10-Oracle 23 ai Vector Search 概述和参数
一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI,使用客户端或是内部自己搭建集成大模型的终端,加速与大型语言模型(LLM)的结合,同时使用检索增强生成(Retrieval Augmented Generation &#…...

Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...