C/C++11 语法/概念易错总结(1)

文章目录

  • 缺省参数
  • 函数重载
  • 引用
  • 引用和指针
  • 内联
  • 宏的优缺点
  • auto
  • 范围for
  • NULL和nullptr

缺省参数

  1. 半缺省参数必须从右往左依次来给出,不能间隔着给
void Func(int a, int b = 10, int c = 20)
 {
     cout<<"a = "<<a<<endl;
     cout<<"b = "<<b<<endl;
     cout<<"c = "<<c<<endl;
 }
  1. 缺省参数不能在函数声明和定义中同时出现
  2. 缺省值必须是常量或者全局变量

函数重载

C++函数重载至少要满足,函数的返回值、函数的参数个数、函数的参数类型、函数不同参数类型的顺序至少有一个不一样 ;

原理:

生成可执行程序需要经过:预处理、编译、汇编、链接 四个阶段 。
在C语言专用的编译器中在: C语言 ——> 汇编代码 这个过程将函数名直接转为汇编代码 ;
而C++专用的编译器中在:C/C++语言 ——> 汇编代码 这个过程将函数名经过修饰转为汇编代码,Linux g++ 编译器修饰的方法为(不同的平台、编译器有不同的修饰方法,但都能支持C++重载的条件):

_Z+函数长度+函数名+类型首字母

在这里插入图片描述
在这里插入图片描述

引用

  1. 引用在定义时必须初始化;
  2. 引用一旦引用一个实体,再不能引用其他实体;
  3. 引用只能引用变量 ;
  4. 传引用返回要保证引用对象没有被销毁 (函数在运行结束后,函数生命周期内定义的变量的空间就会归还给操作系统处理);
  5. 能用引用传参和传返回值尽量用,因为不用拷贝运行效率更高;
  6. 在底层实现上实际是有空间的,因为引用是按照指针方式来实现的

引用和指针

引用和指针的不同点:

  1. 引用概念上定义一个变量的别名,指针存储一个变量地址。
    (在汇编代码层面原理相同)
  2. 引用在定义时必须初始化,指针没有要求
  3. 引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何一个同类型实体
  4. 没有NULL引用,但有NULL指针
  5. 在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32
    位平台下占4个字节)
  6. 引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小
  7. 有多级指针,但是没有多级引用
  8. 访问实体方式不同,指针需要显式解引用,引用编译器自己处理
  9. 引用比指针使用起来相对更安全

内联

  1. 内联是一种建议,编译器不一定采用
  2. 使用内联函数,在编译阶段,会用函数体替换函数调用,缺陷:可能会使目标文件变大,优势:少了调用开销,提高程序运行效率
  3. 内联函数定义和声明不要分离,因为展开是指函数体的展开,分离会导致链接错误,inline被展开,就没有函数地址了,链接就会找不到;

宏的优缺点

优点:
提高代码的可读性和可维护性:宏可以将一系列重复的代码片段封装起来,使代码更加简洁和易于理解。
增加代码的灵活性:宏可以根据不同的参数生成不同的代码,使代码具有更强的适应性和灵活性。
提高代码的复用性:宏可以在不同的地方多次使用,避免了重复编写相同的代码。
提高代码的效率:宏在编译时会被展开,不会引入额外的函数调用开销,可以在一定程度上提高代码的执行效率。

缺点:
宏的使用容易出错:宏展开后的代码可能会与预期不符,容易引入难以发现的错误。
宏的调试困难:宏在编译时展开,调试时无法直接查看宏展开后的代码,增加了调试的难度。
宏的可读性较差:宏展开后的代码可能会变得冗长和难以理解,降低了代码的可读性。
宏的滥用可能导致代码的可维护性下降:过度使用宏可能会导致代码的可维护性下降,增加了代码的复杂性和难度。

C++有哪些技术替代宏?

  1. 常量定义 换用const enum
  2. 短小函数定义 换用内联函数

auto

  1. 编译器在编译期会将auto替换为变量实际的类型
  2. 用auto声明指针类型时,用auto和auto*没有任何区别,但用auto声明引用类型时则必须
    加&
  3. 当在同一行声明多个变量时,这些变量必须是相同的类型,否则编译器将会报错
  4. auto不能作为函数的参数
  5. auto不能直接用来声明数组

范围for

范围for的使用条件:

  1. 容器或数组必须是一个可迭代的对象,即它必须实现了begin()和end()方法,用于返回迭代器指向容器或数组的起始和结束位置。

  2. 迭代器类型必须支持解引用操作,以便可以访问容器或数组中的元素

  3. 对于数组,range-based for循环会自动推导出数组的大小,并使用索引来遍历数组的每个元素。

  4. 对于数组需要知道范围

void TestFor()  // 正确
{
int array[] = { 1, 2, 3, 4, 5 };
for(auto& e : array)
     e *= 2;
for(auto e : array)
     cout << e << " ";
return 0;
}



void TestFor(int array[])  // 错误
{
    for(auto& e : array)
        cout<< e <<endl;
}

for循环原理:

编译器会根据range-based for循环的语法,将其转换为一个普通的for循环。对于容器类型,编译器会调用容器的 begin() 和 end() 方法来获取容器的起始和结束迭代器。这些迭代器用于遍历容器中的元素。对于数组类型,编译器会自动推导出数组的起始和结束位置,并使用索引来遍历数组的每个元素。在每次迭代中,编译器会将当前元素赋值给循环变量,然后执行循环体内的代码。

NULL和nullptr

  1. NULL是宏,定义为 ((void*)0) , nullptr为关键字
  2. nullptr和NULL所占空间相同

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/208495.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

uniapp运行到安卓基座app/img标签不显示

img是html中的标签&#xff0c;他也是一个单标签 image属于服务器控件&#xff0c;是个双标签 问题&#xff1a;uniapp运行到app安卓基座后图片无法显示 原因&#xff1a;自己使用了img标签&#xff0c;而且输入路径无提示&#xff0c;img标签导致图片不显示 解决&#xff…

阅读文献总结2023

阅读文献基于卷积神经网络多源融合的网络安全态势感知模型 阅读文献 基于卷积神经网络多源融合的网络安全态势感知模型 题目基于卷积神经网络多源融合的网络安全态势感知模型文章信息&#xff1a;年份2023发文单位山西财经大学收录刊会计算机科学 &#xff08;北大核心&#…

微服务架构:解析分布式系统的演进

目录 微服务是什么&#xff1f; 微服务的优势 微服务的挑战 应对微服务挑战的方法 结论 在当今快速发展的软件开发领域&#xff0c;微服务架构成为一种备受瞩目的设计理念&#xff0c;被广泛应用于构建灵活、可扩展的分布式系统。本文将深入探讨什么是微服务&#xff0c;为…

掌握HarmonyOS框架的ArkTs如何管理和共享状态数据

ARKTS&#xff08;Ark TypeScript&#xff09;是HarmonyOS应用框架的一部分&#xff0c;提供了一种灵活而强大的状态管理机制。在ARKTS中&#xff0c;AppStorage和LocalStorage是两个关键的概念&#xff0c;它们分别用于应用级和页面级的状态共享。通过深入了解这两个特性&…

管理员配置Jupterhub

在Ubuntu上演示如何部署R语言环境&#xff0c;包括 posit的已经编译了一些R的安装 系统已经装了R&#xff0c;我额外编译的R如何让大家都能用到 如何配置RStudio jupyterhub的配置和使用 管理员如何配置jupyterhub 用户如何配置自己的jupyter环境 Ubuntu上的R部署 这一次…

【C语言】与文件有关的操作

目录 1. 前言2. 什么是文件&#xff1f;2.1 程序文件2.2 数据文件2.3 文件名 3. 二进制文件和文本文件&#xff1f;4. 文件的打开和关闭4.1 流和标准流4.1.1 流4.1.2 标准流 4.2 文件指针4.3 文件的打开和关闭 5. 文件的顺序读写5.1 顺序读写函数介绍5.2 对比一组函数 6. 文件的…

不会代码(零基础)学语音开发(语音开发板)

语音开发板板载资源介绍 通过上图可以看到VDB-150S语音开发板应该是集目前上市的所有语音开发板中板载资源最为丰富的一款开发板。板载的主要资源有&#xff1a; 双色LED状态指示灯&#xff1b;两个测试时使用的按键开关&#xff1b;红外寻迹/接近传感器&#xff1b;固件烧录器…

Redis分布式锁学习总结

⭐️ 前言 想必大家都有过并发编程的经验&#xff0c;在一个单体应用中&#xff0c;可以通过java提供的各种锁机制来控制多线程对于单体应用中同一资源的并发访问&#xff1b;那么在分布式场景下&#xff0c;想要控制多个应用对于同一外部资源的并发访问&#xff0c;就要用到分…

使用YOLOv8训练自己的数据集

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 拉取项目 git clone https://github.com/ultralytics/ultralytics安装依赖 cd ultralytics pip install -r requirement.txt pip instal…

JAVA全栈开发 集合详解(day14+day15汇总)

一、数组 数组是一个容器&#xff0c;可以存入相同类型的多个数据元素。 数组局限性&#xff1a; ​ 长度固定&#xff1a;&#xff08;添加–扩容&#xff0c; 删除-缩容&#xff09; ​ 类型是一致的 对象数组 &#xff1a; int[] arr new int[5]; … Student[] arr …

一种LED驱动专用控制电路方案

一、基本的概述 TM1651 是一种带键盘扫描接口的LED&#xff08;发光二极管显示器&#xff09;驱动控制专用电路&#xff0c;内部集成有MCU 数字接口、数据锁存器、LED 高压驱动、键盘扫描等电路。本产品性能优良&#xff0c;质量可靠。采用SOP16/DIP16的封装形式。 二、特性说…

微软 Power Platform 零基础 Power Pages 网页搭建教程学习实践(一)

微软 Power Platform 零基础 Power Pages 网页搭建教程学习实践 Power Pages 网页搭建 微软 Power Platform 零基础 Power Pages 网页搭建教程学习实践1、Power Pages 介绍2、开始创建一个站点3、选择一个合适的模板4、编辑我们的模板5、面向专业开发人员的高级开发功能6、预览…

PyQt基础_012_对话框类控件QInputDialog

基本操作 import sys from PyQt5.QtCore import * from PyQt5.QtGui import * from PyQt5.QtWidgets import *class InputdialogDemo(QWidget):def __init__(self, parentNone):super(InputdialogDemo, self).__init__(parent)layout QFormLayout()self.btn1 QPushButton(&qu…

[PM3教程]华为手机,小米手环,手表模拟写入加密门禁卡必看教程

IC卡在我们身边已随处可见&#xff0c;被广泛应用于各种领域。 大多数人每天都要和各种各样的卡片打交道&#xff0c;上班有考勤卡&#xff0c;吃饭有饭卡&#xff0c;健身有会员卡&#xff0c;停车有停车卡&#xff0c;连回个家都得先把门禁卡翻出来。各种各样的卡&#xff0c…

借鉴halcon中inspect_3d_surface_intersections.hdev示例

简单看下halcon的实现过程 二、halcon思路 1、读入图片 2、生成点云模型&#xff0c;将点云三角化 3、生成平面 4、求这个模型与平面的交线&#xff0c;生成一个轮廓 用pcl和vtk实现的效果 主要参考以下博主的文章内容来实现的 鞋3D点胶 halcon切平面算法_pose_invert-C…

centOS使用docker部署ElasticSearch和Kibana

一、docker部署ElasticSearch 1、创建网桥 docker network create xybnet 2、下载镜像 docker pull elasticsearch:8.2.0 3、先运行容器 docker run -d \ --name es \ --net xybnet \ -p 9200:9200 \ -p 9300:9300 \ -p 5601:5601 \ -e "discovery.typesing…

TCP/IP_整理起因

先分享一个初级的问题&#xff1b;有个客户现场&#xff0c;终端设备使用客户网络更新很慢&#xff0c;使用手机热点更新速度符合预期&#xff1b;网络部署情况如下&#xff1a; 前期花费了很大的精力进行问题排查对比&#xff0c;怀疑是客户网络问题&#xff08;其他的客户现…

进程间通信2

3. system V-IPC 3.1 知识点 ipcs -a查看所有的ipc对象 在系统中他们都使用一种叫做 key 的键值来唯一标识&#xff0c;而且他们都是“持续性”资源——即他 们被创建之后&#xff0c;不会因为进程的退出而消失&#xff0c;而会持续地存在&#xff0c;除非调用特殊的函数或者…

春秋云镜ED01-CMS v20180505 存在任意文件上传漏洞

靶场介绍 春秋云镜ED01-CMS v20180505 存在任意文件上传漏洞 漏洞分析&#xff1a; 文件类型未校验可以任意上传执行文件&#xff0c;获取服务器权限 登录注册界面 Hi-Lo-Yohttp://eci-2ze2qm1cbaon2lylin0q.cloudeci1.ichunqiu.com/registration.php 注册了几个发现注册不…

Echarts大屏可视化_03 定制柱状图

柱状图模块引入 1.找到合适的图表 在echarts中寻找与目标样式相近的图表 Examples - Apache ECharts 2. 引入柱状图 使用立即执行函数构建&#xff0c;防止变量全局污染 实例化对象 将官网中提供的option复制到代码中&#xff0c;并且构建图表 // 柱状图模块1 (function () {/…