当前位置: 首页 > news >正文

深入了解C++:形参、内联、重载、引用、const和指针、new和delete

形参带默认值的函数

1.给默认值的时候从右向左给。

2.定义出可以给形参默认值,声明也可以给形参默认值。

3.形参默认值只能出现一次。

4.参数调用的效率问题

#sum(10,20)对应了五条汇编指令
mov eax,dword ptr[ebp-8]
push eax
mov ecx dword ptr[ebp-4]
push ecx
call sum
#如果调用sum(10)或sum(),则使用默认参数的形参无需mov。

内联函数

普通的函数调用过程会产生的开销:参数压栈、函数栈帧的开辟和回退过程。

如果是大型函数,这些开销尚可无视,但是对于简单函数,这些开销可能就远远大于函数内部的指令的开销了。

Inline内联函数:在编译过程中,就没有函数调用开销了,在函数的调用点会被建议直接把函数代码进行展开处理。文件的符号表中也不会出现inline函数,但是不是所有的inline都会被编译器处理成内联函数,比如递归,inline只是一个建议。

实务注意:debug版本上,inline是不起作用的,在debug的时候把代码展开要出事的;inline只有在release版本下才能拿出现。

Inline内联函数的普通函数的区别:内联成功的函数,少了函数调用开销,不在符号表中出现。

函数重载

定义:一组函数,其中函数名相同,参数列表的个数或类型不同,则称为函数重载。所以如果仅仅是返回值不同的函数不叫函数重载。一组函数称得上重载,一定是先处在相同的作用域当中的。Const或volatile的时候

C++为什么支持函数重载?

C++在产生符号的时候,是函数名+参数列表类型组成的。C语言产生函数符号的时候,是根据函数名产生的。

函数重载与多态的关系?

多态可以分为静态多态与动态多态。其中静态多态是在编译时期就确定了同名函数所采用的定义(形态),也就是函数重载。

C++和C的相互调用?

C++调用自定义C函数:把C函数的声明扩在extern C里面。

C调用自定义C++函数:把C++函数的源码扩在 extern C里面。

引用

引用和指针的差别

引用是一种更安全、更简单的指针。

1.引用是必须要初始化的,相比起指针不会有空转的可能。在汇编层面语法并无差别。

2.引用只有一级引用,指针可以有一级指针也可以有多级指针。

数组的引用

int array[5] = {};
int (&q)[5] = array;

左值引用

它有内存,有名字,可以放在赋值号左边进行修改的就是左值。它可以出现在等号左边和右边。

int a = 10; 
int &b = a;//a和b都是左值

右值引用

没内存,没名字。指令上必须先产生一个临时量放在寄存器中,使用完毕就从内存中删除。只能出现在等号右边的值。

int &&c = 20;//20是右值
const int &tem = 20;//20是右值。

右值引用变量本身是一个左值,只能用左值因引用来引用它。

不能用一个右值引用变量来引用一个左值。

const

C语言中的Const修饰的变量不能再作为左值。如果没有初始化可能会报错,可能会采用原内存空间的值,具体看编译器。Const被修饰的值叫做常变量,除了不能作为左值,其他规则和普通的变量没有差别。注意,只是不能通过这个常变量作为左值去修改值,但是可以通过提取常变量的内存空间的地址,再通过这个地址间接去修改这个常变量的值。

C++中的const必须初始化。如果初始值是一个立即数,所有出现const常量名字的地方(也就是可以把它当常量使用的地方),在编译的时候都被常量的初始化替换,这个功能类似于宏替换。但是程序运行的时候,这个被修饰的变量,性质就和C语言中一样了。如果初始值是一个变量,性质也和C语言中一样了。

C++中const修饰的经常出现的错误:

  1. 把修饰的量作为左值。
  2. 把修饰的量的地址泄露给普通变量(如果要泄露给普通变量需要做类型转换)。

C++中的Const 与一级指针的结合

C++的语言规范:const修饰的是离它最近的数据类型。

#const int *p和int const *p限制的int
const int x = 5;
const int *p = &x;
*p = 10; // 错误:试图修改指向的值
p++;     // 正确:修改指针本身#int *const p限制的是int *
int x = 5;吗不能、‘’
int *const p = &x;
*p = 10; // 正确:修改指向的值
p++;     // 错误:试图修改指针本身

const如果右边没有指针*的话,const是不参与类型的。

比如const int *p,p的类型是const int*;int * const  p的类型是int *。

New和delete

New和malloc:new不仅可以做内存开辟,还可以做内存初始化操作。Malloc开辟内存失败是通过返回值和nullptr做比较;而new开辟内存失败,是通过抛出bad_alloc类型的异常来做判断,可以通过try_catch语法检测异常。New出来的空间要释放用delete,malloc出来的空间释放要用free。

int *q1 = new int[20];
delete[] q1;int num = new int(20);
delete q1;

相关文章:

深入了解C++:形参、内联、重载、引用、const和指针、new和delete

形参带默认值的函数 1.给默认值的时候从右向左给。 2.定义出可以给形参默认值,声明也可以给形参默认值。 3.形参默认值只能出现一次。 4.参数调用的效率问题 #sum(10,20)对应了五条汇编指令 mov eax,dword ptr[ebp-8] push eax mov ecx dword ptr[ebp-4] push …...

Linux 目录结构结构

Linux 目录结构结构 概念 Linux 没有 C、D、E...盘符,只有一个目录树。通过挂载,将不同的磁盘挂载到目录树下,通过目录访问磁盘。 ‍ 不同目录的作用 目录存放内容/作用​/​根目录,目录树的起点,存放所有文件。​…...

C++基础入门:掌握核心概念(超全!)

C作为一门广泛使用的编程语言,以其高性能和灵活性在软件开发领域占据重要地位。无论是游戏开发、系统编程还是实时应用,C都是一个不可或缺的工具。本博客旨在为初学者提供C编程语言的核心概念,帮助你建立坚实的基础。 C关键字 C关键字是编程…...

Linux第47步_安装支持linux的第三方库和mkimage工具

安装支持linux的第三方库和mkimage工具,做好移植前的准备工作。 编译linux内核之前,需要先在 ubuntu上安装“lzop库”和“libssl-dev库”,否则内核编译会失败。 mkimage工具会在zImage镜像文件的前面添加0x40个字节的头部信息,就可以得到uI…...

数据工程工程师学习路线图

数据工程岗位要求 Skill Sets required: - Hands on experience enabling data via Adobe Analytics and/or Google Analytics - Understanding of how customer level data is captured and stitched with behavioural data - Experience working with Testing (QA) and D…...

MySQL主从同步与分库分表

分库分表...

百度PaddleOCR字符识别推理部署(C++)

1 环境 1.opencv(https://sourceforge.net/projects/opencvlibrary/) 2.cmake(https://cmake.org/download/) 3.vs2019((https://github.com/PaddlePaddle/PaddleOCR/tree/release/2.1) 4.paddleOCR项目-建议2.0(http…...

C++ Qt框架开发 | 基于Qt框架开发实时成绩显示排序系统(2)折线图显示

对上一篇的工作C学习笔记 | 基于Qt框架开发实时成绩显示排序系统1-CSDN博客继续优化,增加一个显示运动员每组成绩的折线图。 1)在Qt Creator的项目文件(.pro文件)中添加对Qt Charts模块的支持: QT charts 2&#xf…...

Microsoft Excel 加载数据分析工具

Microsoft Excel 加载数据分析工具 1. 打开 Excel,文件 -> 选项2. 加载项 -> 转到…3. 分析工具库、分析工具库 - VBA4. 打开 Excel,数据 -> 数据分析References 1. 打开 Excel,文件 -> 选项 2. 加载项 -> 转到… ​​​ 3…...

Day32 贪心算法part02

买卖股票的最佳时机 太牛了我,随随便便双指针秒杀 md题解里面双指针都没用直接for循环秒杀 跳跃游戏 写成这样纯粹是没有看到第一次跳跃必须从第一个开始 class Solution:def canJump(self, nums: List[int]) -> bool:if len(nums) 1:return Truefor i in …...

3分钟带你了解Vue3的nextTick()

前言 Vue 实现响应式并不是数据发生变化之后 DOM 立即变化,而是按一定的策略进行 DOM 的更新。简单来说,Vue在修改数据后,视图不会立刻更新,而是等同一事件循环中的所有数据变化完成之后,再统一进行视图更新&#xff…...

数据库的使用方法

sqlite3 API&#xff1a; 头文件&#xff1a; #include <sqlite3.h> 编译时候要加上-lsqlite3 gcc a.c -lsqlite3 1&#xff09;sqlite3_open int sqlite3_open(const char *filename, /* Database filename (UTF-8) */ sqlite3 **ppDb /* OUT: SQLite db …...

HTML5和CSS3强化知识总结

HTML5的新特性 HTML5的新增特性主要是针对于以前的不足&#xff0c;增一些新的标签、新的表单和新的表单属性等。这些新特性都有兼容性问题&#xff0c;基本是IE9以上版本的浏览器才支持&#xff0c;如果不考虑兼容性问题&#xff0c;可以大量使用这些新特性。 HTML5新增的语义…...

华为机考入门python3--(13)牛客13-句子逆序

分类&#xff1a;列表 知识点&#xff1a; 列表逆序&#xff08;和字符串逆序是一样的&#xff09; my_list[::-1] 题目来自【牛客】 def reverse_sentence(sentence): # 将输入的句子分割words sentence.split() # 将单词逆序排列 words words[::-1] # 将单词用空…...

javaScript实现客户端直连AWS S3(亚马逊云)文件上传、断点续传、断网重传

写在前面&#xff1a;在做这个调研时我遇到的需求是前端直接对接亚马逊平台实现文件上传功能。上传视频文件通常十几个G、客户工作环境网络较差KB/s&#xff0c;且保证上传是稳定的&#xff0c;支持网络异常断点重试、文件断开支持二次拖入自动重传等。综合考虑使用的Aws S3的分…...

从基建发力,CESS 如何推动 RWA 发展?

2023 年 11 月 30 日&#xff0c;Web3 基金会&#xff08;Web3 Foundation&#xff09;宣布通过 Centrifuge 将部分资金投资于 RWA&#xff08;Real World Assets&#xff0c;真实世界资产&#xff09;&#xff0c;试点投资为 100 万美元。Web3 基金会旨在通过支持专注于隐私、…...

qml写一个自适应登录框

1、前言 写一个可自由伸缩的登录框&#xff0c;&#xff0c;&#xff08;横向上&#xff09; 关键&#xff1a;给相关控件赋予 Layout.fillWidth: true 属性 即可。 2、代码 //main.qml import QtQuick 2.12 import QtQuick.Controls 2.12 import QtQml 2.12 import QtQuic…...

考研高数(导数的定义)

总结&#xff1a; 导数的本质就是极限。 函数在某点可导就必连续&#xff0c;连续就有极限且等于该点的函数值。 例题1&#xff1a;&#xff08;归结原则的条件是函数可导&#xff09; 例题2&#xff1a; 例题3&#xff1a;...

ChatGPT在国际中文教育领域引起的变革与挑战

随着ChatGPT这一先进的自然语言处理模型的出现&#xff0c;教学、学习、测评和辅导的传统方式正在面临可能的重塑。她是否会影响中文教育的未来方向&#xff0c;甚至取代中文教师的角色&#xff0c;成为了许多人热议的话题。本文旨在探讨ChatGPT与中文测评之间的联系&#xff0…...

C语言—基础数据类型(含进制转换)

进制转换不多&#xff0c;但我觉得适合小白(我爱夸自己嘿嘿) 练习 1. 确认基础类型所占用的内存空间(提示&#xff1a;使用sizeof 运算符)&#xff1a; 在这里我说一下&#xff0c;long 类型通常占用 4 字节。在 64 位系统上&#xff0c;long 类型通常也可为 8 字节。 格式…...

生成xcframework

打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式&#xff0c;可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

Java 语言特性(面试系列1)

一、面向对象编程 1. 封装&#xff08;Encapsulation&#xff09; 定义&#xff1a;将数据&#xff08;属性&#xff09;和操作数据的方法绑定在一起&#xff0c;通过访问控制符&#xff08;private、protected、public&#xff09;隐藏内部实现细节。示例&#xff1a; public …...

CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云

目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...

在Ubuntu24上采用Wine打开SourceInsight

1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...

C#中的CLR属性、依赖属性与附加属性

CLR属性的主要特征 封装性&#xff1a; 隐藏字段的实现细节 提供对字段的受控访问 访问控制&#xff1a; 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性&#xff1a; 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑&#xff1a; 可以…...

LLMs 系列实操科普(1)

写在前面&#xff1a; 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容&#xff0c;原视频时长 ~130 分钟&#xff0c;以实操演示主流的一些 LLMs 的使用&#xff0c;由于涉及到实操&#xff0c;实际上并不适合以文字整理&#xff0c;但还是决定尽量整理一份笔…...

C++ 设计模式 《小明的奶茶加料风波》

&#x1f468;‍&#x1f393; 模式名称&#xff1a;装饰器模式&#xff08;Decorator Pattern&#xff09; &#x1f466; 小明最近上线了校园奶茶配送功能&#xff0c;业务火爆&#xff0c;大家都在加料&#xff1a; 有的同学要加波霸 &#x1f7e4;&#xff0c;有的要加椰果…...

基于PHP的连锁酒店管理系统

有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发&#xff0c;数据库mysql&#xff0c;前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...

Neko虚拟浏览器远程协作方案:Docker+内网穿透技术部署实践

前言&#xff1a;本文将向开发者介绍一款创新性协作工具——Neko虚拟浏览器。在数字化协作场景中&#xff0c;跨地域的团队常需面对实时共享屏幕、协同编辑文档等需求。通过本指南&#xff0c;你将掌握在Ubuntu系统中使用容器化技术部署该工具的具体方案&#xff0c;并结合内网…...

GB/T 43887-2024 核级柔性石墨板材检测

核级柔性石墨板材是指以可膨胀石墨为原料、未经改性和增强、用于核工业的核级柔性石墨板材。 GB/T 43887-2024核级柔性石墨板材检测检测指标&#xff1a; 测试项目 测试标准 外观 GB/T 43887 尺寸偏差 GB/T 43887 化学成分 GB/T 43887 密度偏差 GB/T 43887 拉伸强度…...