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所占空间相同

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据算法之层次聚类——(待完善)

1.数据挖掘入门笔记——层次聚类 ( 浮光掠影) 2.聚类算法&#xff1a;Hierarchical Clustering层次聚类 3.一文读懂层次聚类&#xff08;Python代码&#xff09; 4.层次聚类 5.聚类分析&#xff08;三&#xff09; 层次聚类及matlab程序 5.聚类算法之层次聚类&#xff08…

【题目】链表相关算法题

文章目录 一. 合并两个有序链表题目解析算法原理代码编写 二. 相交链表问题题目解析算法原理代码编写 三. 环形链表问题1. 判断是否有环2. 计算环的长度3. 找到环的入口点 四. 反转链表方法一&#xff1a;边迭代、边逆置方法二&#xff1a;头插 五. 判断链表是否回文题目解析算…

20231201将RK3399的挖掘机开发板在Andorid12系统下的强制横屏

20231201将RK3399的挖掘机开发板在Andorid12系统下的强制横屏 2023/12/1 22:54 【不完美的地方&#xff1a;修改之后不满屏】 百度&#xff1a;rk3399 android12 横屏 不满屏 Android 显示不满屏 build.prop https://blog.csdn.net/weixin_39966398/article/details/105595184?…

深入了解c语言中的结构体

介绍&#xff1a; 在C语言中&#xff0c;结构体是一种用户自定义的数据类型&#xff0c;它允许我们将不同类型的数据组合在一起&#xff0c;形成一个更为复杂的数据结构。结构体可以用来表示现实世界中的实体&#xff0c;如人员、学生、图书等。本篇博客将介绍结构体的基本概念…

LLM:《第 3 部分》从数学角度评估封闭式LLM的泛化能力

一、说明 在 OpenAI 或 Anthropic 等封闭式大型语言模型 (LLM) 领域&#xff0c;对智能和多功能性的真正考验在于它们处理高特异性查询并在响应中表现出独特性的能力。在这篇博客中&#xff0c;我的目标是提供测试这些模型泛化能力的机制。 封闭式LLM意味着您不知道训练语料库的…

electerm下载和安装

electerm下载和安装 一、概述 electerm 是一款免费开源、基于electron/ssh2/node-pty/xterm/antd/ subx等libs的终端/ssh/sftp客户端(linux, mac, win)。 而且个人觉得electerm界面更好看一些&#xff0c;操作都是类似的。 二、下载安装 下载地址&#xff1a;https://elec…

HarmonyOs 4 (二) HelloWord

目录 一 开发工具下载安装1.1 下载安装包1.2 下载相关依赖 二 开发者注册与个人实名认证三 第一个程序2.1 创建第一个程序2.2 认识开发者界面2.3 目录结构认识2.3.1 父目录认识2.3.2 AppScope 目录2.3.3 entry目录2.3.3.1 ets 目录2.3.3.2 resources目录 2.3.4 认识配置文件2.3…

【高效开发工具系列】驼峰下划线互转

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

java基于springboot框架的中小企业人力资源管理系统的设计及实现+jsp

&#xff08;1&#xff09;员工信息管理&#xff1a;员工的基本信息&#xff0c;人员编制&#xff0c;岗位管理&#xff0c;人员流动管理&#xff08;老员工转出&#xff0c;辞职&#xff0c;退休等&#xff09;&#xff0c;职工业绩考核归公管理&#xff0c;工人工种管理。 &…

Hdoop学习笔记(HDP)-Part.11 安装Kerberos

目录 Part.01 关于HDP Part.02 核心组件原理 Part.03 资源规划 Part.04 基础环境配置 Part.05 Yum源配置 Part.06 安装OracleJDK Part.07 安装MySQL Part.08 部署Ambari集群 Part.09 安装OpenLDAP Part.10 创建集群 Part.11 安装Kerberos Part.12 安装HDFS Part.13 安装Ranger …

Jinja2使用Layui报 “d is not defined“

问题出现场景在使用Jinja2渲染Layui的表格时候&#xff0c;要做自定义templte的传入 Jinja2这块本来就是支持 {{ }} 插值的模板语言&#xff0c;所以这块的第一种渲染方式会冲突 所以只能用函数返回代码块进行填充&#xff0c;不能使用插值&#xff0c;只能拼接字符串 templt…

unity3d c#代码变更文本颜色,可选多参数,委托invoke延迟调用函数

[SerializeField] private Text warning; Color color ;warningOpen("注册成功", closeTime: 1.5f);warningOpen("登录成功", "green", 1.5f);public void warningOpen( string warn, string tmp"red", float closeTime5f ){warnin…