cpp基础(2)

2、CPP 基础语法学习 很多语法点从汇编角度分析就很明了了 加油一、基础语法 A1、cin、cout2、函数重载(Overload)3、默认参数4、extern "C"C 和 C++混合开发二、基础语法 B5、内联函数 (inline function)窥探内敛函数的本质:内联函数与宏表达式6、 const7、引用(Reference)引用的本质三、汇编语言1、学习汇编指令的 2 大知识点:2、内联汇编3、汇编指令mov 指令call 指令lea指令(指针)ret、add、sub、inc、dec、xorjmp常见代码的汇编4、. 阅读详情

cpp基础(2)

引用

概念与特性

举个例子先,一个人可以有很多别名,比如catjuicy又名猫汁、猫老菩萨、猫大左等等,如果在大街上喊这些名字,都会说同一个人来回应。因此,cpp开启了一个全新的概念:引用(cite) ,使用方法如下:

void test()
{
   int m = 0;
   int& z = m;
}

z便是引用类型,意味着z是m的别名,他们是一体的,引用类型也必须和引用的实体是同种类型的。

如果此时对z进行修改,m和z的值都会被同时修改,因为他们是一样的,连地址都是相同的,这与c中的指针类型很像但是不完全一样,因为引用更浅显易懂,而且方便使用。

此外,引用时有3点要注意:
1.引用在定义时必须初始化
2.一个变量可以有多个引用
3.引用一旦引用一个实体,就不可以引用其他实体

常引用

老样子,举个例子先:

void test()
{
   const int m = 1;
   //int& rm = m; //不可以
   const int& rm =m;//可以

   //int& rz = 96; //不可以
   const int& rz =96;//可以

   double d =6.4;
   //int& rd =d; //不可以
   const int& rd = d;//可以
}

下面来做解释,引用的范围只可以缩小不可以扩大。
第一个,因为m是const只读类型的,所以m不可以是int&的引用,因为int&是既可以读又可以写,属于范围扩大,所以只可以使用同种const只读类型的引用;
第二个,因为96是一个常数,是不可以修改的,同样也只可以使用const只读类型的引用来引用96;
第三个,因为double是八字节类型的,而且存储方式和整形int类型天差地别,但是有人会问了,double a = 8.8; int b = a;这个算什么呢,其实,a会先创造出一个int的整形临时变量,把整型值赋予到这个临时变量中,b再等于这个临时变量。不用想,这个int整形临时变量肯定也是只读的,因此,可以使用const只读引用来引用。

使用场景

讲了这么多,相信有慧根的各位已经想到了引用的用法:
1. 作为函数参数
2. 作为函数的返回值

没错,正是这样,举两个例子先:

void swap(int& a, int& b)
{
    int tmp = a;
    a = b;
    b = tmp;
}

and

int& count()
{
    static int n = 0;
    n++;
    return n; 
}

第一个如图所示,放弃了传统的指针类型,而是采用引用便可以达到和指针一样的效果。
第二个如图所示,但是注意n一定要设置为static全局变量,不然出了栈帧n会销毁,因此如果再次调用其他函数会导致函数返回值变成随机值。所以:如果函数返回时,出了函数作用域,如果返回对象未返还给系统,则可以使用引用返回,如果已经还给系统了,那么必须使用传值返回。

效率

如大家所想,参数传引用和传值效率相比,传引用必然更快,因为地址都相同,不会重复创建新的临时变量,自然快人一步;
同时,函数返回值使用引用or值返回自然效率也会不同,与上面同理;
但是,传引用和传指针,函数返回值返回引用和指针,二者效率相差不多,因为底层原理都相似。

引用与指针的区别

在语法层面,引用只是一个别名,不会独立开辟空间,而是和原本的实体共用一块空间,但是仔细一想,这怎么可能呢,创造一个新变量怎么会电脑会没有变化呢?当然,下面来从底层实现来解释一下:
在底层逻辑中,引用和开辟新指针的汇编代码是完全一样的,这意味着,其实引用本质和指针就是同一种操作,只不过是cpp的创始人为了理解更方便而创造出的概念,但是底层实现还是一模一样的,(感觉像cpp创始人给开辟指针来了一个引用)。
当然,也是使用方面肯定有区别的,区别如下:
在这里插入图片描述

内联函数

相信在c中,大家都记得宏定义(define) , 当然,我来简单写一个宏定义的add函数好了,#define ADD(a, b) ((a)+(b)),肯定会有人说,这么多的括号甚是麻烦,还要注意很多细节,有没有别的办法呢?
当然!cpp设置了全新的内联函数,只需要在函数定义or声明前加一句online,便可以轻松实现和宏定义类似的功能,举个例子先:

inline int ADD(int a , int b)
{
     return a+b;
}

开始介绍,inline对于编译器只是一个建议,如果函数过长 (一般编译器会认为10行以上算长) 或者函数内部有循环or递归时,编译器便会不采用像宏定义一样直接展开,而是在程序编译时的链接环节时调用函数地址从而调用函数,这是很聪明的做法。

inline和宏定义一样,都是以空间换时间,省去调用函数额外的开销,但是inline不可以声明和定义相分离,举个例子:如果有一个add.h和add.cpp的话,add.h写函数声明但是add.cpp写函数的定义。
那么,不管inline写在那个文件里面,在test.cpp中整体的函数都是运行不了的,原因是如果inline的话函数不会生成地址,那么在编译的链接环节时根本找不到相关的函数。当然了,如果非要写的话,只能写在add.h中,因为在编译中的预编译阶段中会将add.h这些头文件展开,这样才可以看到内联函数。

c++基础2 注意:早期标准库将所有功能在全局域中实现,声明在.h后缀的头文件中,使用时只需包含对应头文件即可,后来将其实现在std命名空间下,为了和C头文件区分,也为了正确使用命名空间,规定C++头文件不带.h;在c++中的输出其实是 阅读详情

相关推荐

BehaviorTree.CPP4.6行为树库使用说明

在上面的例子中, 使用函数指针(依赖注入)HelloTick创建了一种调用特定类型的 TreeNodes。通常,要定义自定义 TreeNode,您应该从类继承TreeNode数据流、端口和黑板(下面是一颗简单的树您可能会注意到:树的第一个标签是。它应该包含1 个或多个标签。该标签应该具有属性[ID]。标签应该包含属性。每个 TreeNode 都由一个标签表示。标签的名称是用于在factory中注册TreeNode的ID。该属性[name]指的是实例的名称,是。

yyh0201的博客 4715

零基础上手keras2cpp:C++新手也能看懂的神经网络移植教程

**keras2cpp**是一个将Keras神经网络模型移植到纯C++环境的实用工具,特别适合希望在C++项目中部署深度学习模型的开发者。本文将通过简单易懂的步骤,带您快速掌握如何将Keras模型转换为C++代码并运行,即使您是C++新手也能轻松上手! ## 📌 为什么选择keras2cpp? 在深度学习项目中,我们通常使用Python和Keras快速构建和训练模型,但部署时可能需要更高性

gitblog_01200的博客 957

2 基础【C++】

C++ PTA

小心星的博客 1097

CPP基础2

函数1.普通函数定义int add(int x, int y); int a = 2; add(a) int x形参不占用内存 实参 a 给形参初始化后,形参才分配内存 形实结合有值调用和引用 值调用就是传递数值 引用传递地址 实际应用举例引用void swap(int &x) { x = 4; } int a = 5; swap(a); swap(1);//错误引用必须传地址,void

renzhe20092584的专栏 615

第 2 章 C++ 基础语法

本章介绍了C++基础语法知识,主要内容包括: C++语言概述:特点、标准库、应用领域及版本演进 编译器详解:GCC、Clang、MSVC等主流编译器特点及使用 基础语法实践:从HelloWorld案例到编译过程详解 代码规范:注释使用、命名空间、头文件组织等 语言要素:修饰符、标识符、关键字分类及用法 本章通过综合案例展示C++多范式特性,涵盖面向过程、面向对象和泛型编程,并配有思考题帮助理解核心概念。

杨充 1536

Gemma.cpp:简化深度学习推理的利器

gemma.cpp是一个轻量级、独立的C++推理引擎,专为Google的Gemma基础模型设计。它致力于在保持简洁和直接性的同时,提供足够的灵活性以便于实验和研究。

步子哥的博客 1393

CPP基础(2)

传递参数时 采用引用引用很容易与指针混淆,他们之间有三个主要的不同:①不存在空引用 ,引用必须连接到一块合法的内存②一旦引用被初始化为一个对象,就不能被指向另一个对象,指针可以在任何时候被指向到另一个对象。③引用必须在创建时被初始化,指针可以在任何事件被初始化④官方没有明确说明,但是引用确实不是传统意义上的独立变量当返回一个引用时,要注意被引用的对象不能超过作用域,所以返回一个对局部变量的引用是不合法的,但是可以返回一个对静态变量的引用。①重载相等的运算符operator==

m0_65107465的博客 1068

从汇编到C++的桥梁:asm2cpp转换工具

本文还有配套的精品资源,点击获取 简介:本文探讨了如何将x86汇编语言转换为C++代码,强调了在特定场合汇编语言的重要性,并通过asm2cpp工具简化了转换过程。转换过程包括语法解析、指令映射、标签处理、预处理器宏的使用以及内存模型的处理。虽然转换后的C++代码具有更好的可读性和可维护性,但可能会丢失某些汇编特性,因此转换需要深思熟虑。 1. x86汇编语言基础 ...

weixin_42360733的博客 1913

CPP2-基础部分(1)

参考自《c++ primer plus》《c++ primer 5th zh》、《The C++ Programming Language 4th Ed》

shouhuxianjian的专栏 1459

利用Openlayers4实现地图遮罩效果(二)

之前实现的遮罩效果,在深色背景的底图上,对要突出的区域采用半透明遮罩,以此来突出该区域。但是有时底图颜色偏白,这时候不再适合对要突出的区域采用遮罩,而是要对突出区域之外进行遮罩处理。两种效果的对比入下图: ...

此爱如少年 6399

unity人物刚体移动_Unity3D实现2D人物移动-总结篇

背景最近研究Unity3d,2d寻路的实现。所以又一次涉及到了角色坐标位移的问题。系统的对于角色鼠标点击移动这个简单问题进行整理和总结。本来就是一个简单的几何问题,结果发现已经有两个小坑,顺便填上,这里做下总结。实现需求:通过鼠标点击,控制2d角色移动,就是点哪里,角色向移动到哪里问题分解:按照时间进行动画分解,鼠标输入(动画开始)、平移(动画进行)、移动结束(动画结束)前提:这里前面的文章基本解...

weixin_39610366的博客 1277

CPP 基础学习2

c++

wade1010的专栏 212

报错:subprocess.CalledProcessError: Command ‘[‘where‘, ‘cl‘]‘ returned non-zero exit status 1.

右键此电脑--属性--高级系统设置--环境变量--系统变量--找到Path。Enterprise是企业版,如果你是社区版就找Community。2.安装的时候,c++桌面那个需要勾选。

2301_77554343的博客 1507

ROS 2 Bag文件C++读取实践:从基础API到性能优化全解析

在机器人开发与数据处理中,数据序列化与反序列化是核心基础技术,它决定了系统间数据交换的效率和可靠性。ROS 2采用CDR等序列化格式,将复杂的消息结构转换为二进制流进行存储与传输,其原理在于通过统一的接口描述语言定义数据结构,实现跨语言、跨平台的数据兼容。这项技术的价值在于支持机器人系统中多传感器、多节点间海量数据的高效记录与离线分析,是算法验证、数据回放和系统调试的基石。典型的应用场景包括自动驾驶的传感器数据回放、工业机器人的轨迹复现以及科研中的算法性能评估。本文聚焦于ROS 2 Bag文件这一特定数据载

weixin_29611239的博客 234

Discuz IIS上传附件大于28M失败报错Upload Failed.修改maxAllowedContentLength(图文教程)

下图:Discuz X3.5的系统信息,上传许可为1024MB(1GB)论坛为局域网论坛,仅供内部同事交流使用!使用官方最新的Discuz! X3.5 Release 20231221 UTF-8 下图:选择上传附件(提示可以最大上传100M) 下图:模拟上传84M的文件(

骚团长的博客 1830

深度学习的卷积神经网络的煤矸石识别

在本博文中,我们提出了一种基于深度学习的煤矸石检测与识别系统,该系统采用YOLOv8算法对煤矸石进行检测和识别,实现对图片中的煤矸石进行准确识别。1.项目需求对煤矸石进行检测与识别,系统将识别出图片中的克服小块煤矸石漏检的缺陷。 2.项目实现 通过调研,本项目最终使用yolov8模型作为目标检测的模型, YOLOv8 旨在快速、准确且易使用,使其成为广泛的物体检测、图像分割和图像分类任务的极佳选择。 1.数据集:格式为jpg的3091张煤矸石图片2.YOLOv8环境配置yolo检测网络包括24个卷积层

2201_75355700的博客 792

C++零基础到工程实战(1.2):cpp从源代码到可执行文件及每种文件作用

本文详细讲解了C++程序从源代码到可执行文件的完整生成流程。首先介绍了.cpp源文件和.h头文件的作用,以及编译后生成的.obj目标文件和最终.exe可执行程序的关系。重点阐述了五个关键步骤:预处理(处理宏和头文件)、编译(转汇编代码)、汇编(生成机器码)、链接(合并目标文件)和最终执行。通过分析HelloWorld示例,说明了一个C++程序需要经过预处理、编译、汇编、链接才能生成可执行文件,并强调了main函数的唯一性和.pdb调试文件的作用。掌握这一流程有助于开发者理解C++程序的构建过程,为后续工程开

冰冻三尺非一日之寒 520

Calibre LVS效率翻倍秘籍:用Hierarchical Flow处理亿级晶体管设计的5个关键阶段

本文详细解析了如何利用Hierarchical Flow技术提升Calibre LVS在亿级晶体管SoC设计中的验证效率。通过五个关键阶段的分层验证流程,包括顶层抽象验证、模块级独立验证等,可显著降低内存占用40-60%,缩短迭代周期50-70%,特别适用于SMIC等先进工艺节点。文章还分享了算力资源优化、并行化处理等实战技巧,帮助工程师应对大规模芯片验证挑战。

sam99的博客 768

C++基础语法2

本篇学习笔记介绍了 C++ 中的变量和数据类型,将变量比作“箱子”,详细讲解了整数类型(int、long long)和浮点数类型(float、double)的使用场景及命名规则。通过实际代码示例,演示了变量的赋值、计算圆形泳池体积、平均分数、最终成绩以及字符运算等操作。帮助初学者掌握变量声明、数据类型选择及基本编程技巧,为后续学习打下坚实基础

overload100的博客 994

弹窗提示报错: F:\c\CFX5\bin\Debug\net9.0-windows10.0.26100.0\CFX5.dll 面向无法动态枚举工具箱项目的平台...如何解决?

🏆本文收录于 《全栈Bug调优(实战版)》 专栏,该专栏专注于分享我在真实项目开发中遇到的各类疑难Bug及其深层成因,并系统提供高效、可复现的解决思路和实操方案。无论你是刚入行的新手开发者,还是拥有多年项目经验的资深工程师,本专栏都将为你提供一条系统化、高质量的问题排查与优化路径,助力你加速成长,攻克技术壁垒,迈向技术价值最大化与职业发展的更高峰🚀!

**My Coding Family** 947

【误码率仿真】基于matlab 小波变换OFDM误码率仿真

其中,与传统的 OFDM 相比,小波变换 OFDM 在进行调制和解调时,使用的是小波变换函数。需要注意的是,由于小波变换函数将频域信号转换为时域信号,因此与传统 OFDM 不同,小波变换 OFDM 中的信号需要在时域上添加循环前缀。与传统的 OFDM 不同,小波变换 OFDM 使用小波函数作为基函数,而非正弦函数作为基函数,因此可以在保持子载波正交性的同时,让子载波之间的带宽变得更加均匀。在频域进行信号加权,然后进行小波逆变换,得到时域信号。在接收端进行信号接收,去掉循环前缀并进行小波变换得到频域信号。

Fanjufei的博客 662

python2cpp :帮助Python开发者轻松入门C++

python2cpp :帮助Python开发者轻松入门C++ 项目介绍 在编程语言的世界中,Python因其简洁易懂的语法和丰富的库资源,深受开发者的喜爱。然而,在某些性能敏感的应用场景中,C++由于其高效的执行速度和底层操作的灵活性,成为了更好的选择。对于熟悉Python的开发者来说,如何快速掌握C++,成为了进入新领域的关键。python2cpp项目应运而生,旨在帮助有一定Python基础的程...

gitblog_00473的博客 594

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

C++第2章学习笔记——C++基础语法与语言基础

本章承接C语言基础,补充C++新增基础语法,是所有面向对象代码的底层铺垫,掌握输入输出、常量变量、基本语句才能完成后续复杂类的编写。本章核心知识点1. 标准输入输出: cin 输入、 cout 输出, #include 头文件;2. 基础数据类型:int、double、char、bool布尔类型(C++独有);3. 常量定义: const 修饰常量,替代C语言#define;4. 流程控制语句:if判断、for/while循环、switch分支;5. 命名空间 using namespace std; 作

lkd__的博客 41

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

【重走C++学习之路】2、C++基础知识

七千字长文,帮助初学者快速上手C++,了解基本的C++知识,为后续的学习打下基础。

MeiYu_123的博客 1239

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Cpp2IL核心功能详解:从基础概念到高级应用

Cpp2IL是一款针对Unity游戏的IL2CPP逆向工具,能够将IL2CPP编译后的二进制文件还原为原始的托管DLL,帮助开发者和研究人员深入分析Unity游戏的内部结构与逻辑。本文将从基础概念出发,全面解析Cpp2IL的核心功能、使用方法及高级应用技巧,让你快速掌握这一强大工具的实战价值。 ## 一、IL2CPP逆向基础:为什么选择Cpp2IL? Unity的IL2CPP技术将C#代码编译

gitblog_00099的博客 540
上一篇: cpp基础(1)
下一篇: cpp基础(3)
lain2002
博客等级 码龄5年 0粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值