【C->Cpp】由C迈向Cpp(4)


目录

(一)内联函数

 (二)关键字auto

 (三)范围for

 (四)nullptr


正文开始:

(一)内联函数

宏定义:

        C++的内联函数是在C语言宏的基础上提出的,C语言宏是一种预处理器指令,用于在编译过程中进行文本替换。宏定义可以用来定义常量、函数、条件语句等,它们在程序编译之前被替换为相应的代码。

        宏定义使用#define关键字,语法格式为:

#define 宏名 字符串

        宏名通常使用大写字母表示,字符串可以是任意有效的C语言代码。宏定义的作用范围为宏定义之后直到文件末尾或者遇到#undef指令。宏名称在程序中会被替换为对应的字符串,这个替换过程是在编译之前由预处理器完成的。

宏函数:

        宏定义还可以带有参数,类似于函数,可以根据参数的不同生成不同的代码。宏参数使用括号括起来,并且在宏定义中用逗号隔开。例如:

#define MAX(x, y) ((x) > (y) ? (x) : (y))

这个宏定义了一个求两个数中较大值的函数,它可以像函数一样调用:

int max = MAX(a, b);

在编译过程中,预处理器会将MAX(a, b)替换为((a) > (b) ? (a) : (b)),然后再进行编译。

 条件宏:

        宏定义还可以使用条件语句,例如:

#define DEBUG

#ifdef DEBUG printf("Debugging is enabled\n"); #endif

        在编译过程中,如果宏定义了DEBUG,那么条件编译指令#ifdef DEBUG和#endif之间的代码会被编译,否则会被忽略。

        总之,C语言中的宏定义提供了一种在编译前进行代码替换的机制,它可以提高代码的灵活性和可重用性。但是宏定义也有一些缺点,如代码可读性差(导致调试不方便)、与函数相比没有类型检查(宏做的仅仅是替换),在有些场景下比较复杂(需要谨慎替换后运算符的优先级)等。因此,在使用宏定义时需要谨慎考虑代码的可读性和可维护性。

        由于宏的缺点比较明显,于是C++推荐:

        i, 用const和enum替代宏常量;

        ii,用inline(内联函数)替代宏函数;

 C++的替代

        宏常量可以牵一发而动全身,提高代码的可维护性;宏函数可以不用建立函数栈帧,提高了效率;

内联函数

//内联函数的写法
inline Add(int x,int y)
{
    return x+y;
}

int main()
{
    std::cout << Add(6,5) << std::endl;

    return 0;
}

特性:

        内联函数是以空间换时间的做法,如果编译器将函数当成内联函数处理,会在编译阶段,用函数体替换函数调用;

        缺陷:可能会使编译后的文件(可执行程序)变大;

        优点:减少了调用开销,提高了程序运行效率;

        

        内联函数是对编译器的一个建议,对于我们实现的内联函数,编译器不一定执行,不同编译器关于inline函数得实现机制可能不同;一般情况下,建议将函数规模较小,不是递归且频繁调用的函数采用inline修饰,否则编译器会忽略inline特性;

        inline函数不要让声明和定义分离,分离会导致链接错误;因为inline被展开,就不再调用函数,没有函数地址了,链接就会找不到。

 (二)关键字auto

        在C++中,关键字auto用于声明一种自动类型推断的变量。它允许编译器根据变量的初始值来推断变量的类型,并将其类型作为变量的类型。

        使用auto关键字可以简化代码,减少类型声明的冗余,并提高代码的可读性。

int a = 10;
auto b = a;//自动推断b的类型为int

         auto关键字被用于声明变量b,并根据它们的初始值来推断其类型。

auto x = 10; // x的类型被推断为int
auto str = "Hello"; // str的类型被推断为const char *

        auto关键字被用于声明变量x和str,并根据它们的初始值来推断其类型。

        迭代器类型推导:

        auto关键字可以在C++11及以后的版本中用于自动推导迭代器类型。

std::vector<int> numbers = {1, 2, 3, 4, 5}; 

for(auto it = numbers.begin(); it != numbers.end(); ++it) 
{
     std::cout << *it << " "; 
}

        在上面的例子中,auto关键字用于推导迭代器it的类型,编译器会根据numbers容器的类型推导出it的类型为std::vector<int>::iterator(这样就简化了输入类型的代码)。

auto特性: 

        需要注意的是,auto关键字在类型推导时会考虑初始化值,所以在使用auto声明变量时,要确保初始化值是明确的,否则推导的结果可能不符合预期。

        auto不能作为函数形参的类型推导;

        auto不能直接用来声明数组;

        在一行声明多个变量时,变量的推断类型必须一致;

auto a = 5,b = 6;    //推断为int
auto a = 5,b = 6.0;  //推断声明失败

 (三)范围for

         C++11中新增的语法,便利数组,新增了范围for的用法:

int arr[] = {1,2,3,4,5};

for(auto i : arr )
{
    cout << i << endl;
}
int arr[] = {1,2,3,4,5};

for(int i  = 0; i < sizeof(arr)/sizeof(int);i++ )
{
    cout << arr[i] << endl;
}

        上述两种遍历数组的结果是一样的;

        对于范围for,编译器自动识别数组中的数据类型并赋值给i对象,自动判断结束;

范围for特性:

         e的改变并不会改变数组元素的值:

int arr[] = {1,2,3,4,5};

for(auto i : arr)//e的改变并不影响数组的元素的值
{
    e*=2;
    cout << e << endl;
}

        不能在数组传参的函数内使用,数组传参本质上是传递数组首元素的地址;

 (四)nullptr

         C++中如果NULL作为函数参数进行函数重载,会被默认识别成  整型0 ,但是NULL本质上是(void*)0  ;

        于是C++11打了一个补丁,用nullptr替代NULL,nullptr会被识别为(void*)0;

        nullptr是一个关键字;

        (为了向前兼容,C++没有直接将NULL的定义改为(void*)0)


完~

未经作者同意禁止转载

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

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

相关文章

适用于 Linux、Windows 和 macOS 的免费 ONLYOFFICE 桌面应用程序

前言&#xff1a; 最近也是发现了一款特别好用的免费ONLYOFFICE 桌面应用程序忍不住分享给大家&#xff0c;这款编辑器能够打开、阅读和编辑多种文件类型&#xff0c;包括.docx文档、.pptx幻灯片和.xlsx表格等开放XML格式的Office文档。此外&#xff0c;ONLYOFFICE桌面编辑器还…

Puppeteer 使用实战:如何将自己的 CSDN 专栏文章导出并用于 Hexo 博客(三)

文章目录 往期效果将文章信息导出适配 hexo 的文章模板导出的文章路径问题终端控制执行脚本代码整理结尾 往期 Puppeteer 使用实战&#xff1a;如何将自己的 CSDN 专栏文章导出并用于 Hexo 博客&#xff08;二&#xff09; 效果 写了一个 node 脚本用来批量处理 md 文件 本期…

初识 iOS 自动化测试框架 WebDriverAgent

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

软件测试面试喜欢问的linux文件操作命令总结

1切换目录 我们切换目录的命令是cd 但是在切换的时候&#xff0c;可以用两种形式&#xff0c;一种是绝对目录的形式切换&#xff0c;一种是相对目录的形式切换。 绝对路径&#xff1a;以 / 开头&#xff0c;或者 ~ 开头&#xff0c;分别表示根路径或者root路径。表示从根目录…

学习 python的第四天,顺便分享两首歌:we don‘ talk anymore,You ‘re Still The One

诸君晚上好&#xff0c;现在是&#x1f303;晚上&#xff0c;今天是学习python的第四个学习日&#xff0c;不知不觉学了四天了&#xff0c;还是那句话&#xff1a;不积跬步无以至千里、不积小流无以成江海&#xff01; 暂时回顾下前面的学习日吧&#xff1a; 第一个学习日----…

C++入门04 函数的参数传递、引用类型与重载

图源&#xff1a;文心一言 听课笔记简单整理&#xff0c;供小伙伴们参考&#xff0c;包含以下内容“&#x1f40b;3.11 引用类型、&#x1f40b;3.14 内联函数、&#x1f40b;3.15 默认参数值、&#x1f40b;3.16 函数重载、&#x1f40b;3.17 C系统函数”~&#x1f95d;&…

Sora的第一波受害者出现了。

不知道大家最近除了被Sora刷屏之外&#xff0c;有没有被这张图刷屏 我只能说网友太强大了 说实话&#xff0c;我进入舟老师的直播间&#xff0c;每次都是还有3分钟下播&#xff0c;还有6单就拍完 但是10分钟后还在激情逼单&#xff0c;6单之后还有6单 也许在营销学上&#x…

Vitis HLS 仿真 C++ 工具代码分享

1 自媒体账号 目前运营的自媒体账号如下&#xff1a; 哔哩哔哩 【雪天鱼】: 雪天鱼个人主页-bilibili.com微信公众号 【雪天鱼】 CSDN 【雪天鱼】: 雪天鱼-CSDN博客 菜鸡一枚&#xff0c;记录下自己的学习过程&#xff0c;可能后续有更新&#xff0c;也可能没有更新&#xff…

C# cass10 面积计算

运行环境Visual Studio 2022 c# cad2016 cass10 通过面积计算得到扩展数据&#xff0c;宗地面积 &#xff0c;房屋占地面积&#xff0c;房屋使用面积 一、主要步骤 获取当前AutoCAD应用中的活动文档、数据库和编辑器对象。创建一个选择过滤器&#xff0c;限制用户只能选择&q…

Commonjs 和 Es Module详解

一 前言 今天我们来深度分析一下 Commonjs 和 Es Module&#xff0c;希望通过本文的学习&#xff0c;能够让大家彻底明白 Commonjs 和 Es Module 原理&#xff0c;能够一次性搞定面试中遇到的大部分有关 Commonjs 和 Es Module 的问题。 带上疑问开始今天的分析&#xff1a; …

贷齐乐系统最新版SQL注入(无需登录绕过WAF可union select跨表查询)

一、环境 已上传资源&#xff08;daiqile&#xff09; 二、代码解释 1.1Request 不管get请求还是post请求都可以接收到 1.2过滤的还挺多 1.3第二个WAF把数据分为两个了一个Key一个value&#xff0c;全是explode的功劳 1.4submit是if进入的前提 很明显走进来了 1.5那我们在这…

springboot206基于SpringBoot的农商对接系统的设计与实现

基于Spring Boot的农商对接系统的设计与实现 Design and implementation of agricultural business docking system based on Spring Boot 摘 要 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离…

day05-进程通信

1> 将互斥机制的代码实现重新敲一遍 代码&#xff1a; #include<myhead.h>int num520;//临界资源//1.创建互斥锁 pthread_mutex_t fastmutex;//定义任务函数 void *task1(void *arg){printf("1111111\n");//3.临界区上面获取锁资源&#xff08;上锁&#…

开发个IDEA插件

开发IDEA一个插件&#xff0c;但是这个插件的功能是个大杂烩吧&#xff0c; 主要完成以下几个功能&#xff0c;方便组内开发人员提高效率。 1 网关会传过来登录人员的 一些核心字段&#xff0c;公司编码/用户编号/主岗。 因为存在多租户&#xff0c;所以经常要切换任务&…

【ACM出版】第五届计算机信息和大数据应用国际学术会议(CIBDA 2024)

第五届计算机信息和大数据应用国际学术会议&#xff08;CIBDA 2024&#xff09; 2024 5th International Conference on Computer Information and Big Data Applications 重要信息 大会官网&#xff1a;www.ic-cibda.org 大会时间&#xff1a;2024年3月22-24日 大会地点&#…

LeetCode 0106.从中序与后序遍历序列构造二叉树:分治(递归)——五彩斑斓的题解(若不是彩色的可以点击原文链接查看)

【LetMeFly】106.从中序与后序遍历序列构造二叉树&#xff1a;分治&#xff08;递归&#xff09;——五彩斑斓的题解&#xff08;若不是彩色的可以点击原文链接查看&#xff09; 力扣题目链接&#xff1a;https://leetcode.cn/problems/construct-binary-tree-from-inorder-an…

开发Chrome插件,background.js中log打印未出现在控制台

不同于内容脚本&#xff08;通常命名content.js&#xff09;&#xff0c;在后台脚本&#xff08;通常命名background.js或service-worker.js&#xff09;中console.log并不会在控制台中直接显示。 要查看后台脚本上下文的正确控制台&#xff0c;执行如下步骤&#xff1a; 访问…

leetcode hot100单词拆分

在本题中&#xff0c;我们是要把一个字符串&#xff0c;判断是否能用给的字符串数组中的单词进行拆分&#xff0c;如果可以则返回true&#xff0c;不能的话则返回false。这个题一开始看无法与背包问题联系在一起。但仔细考虑&#xff0c;就是用物品&#xff08;给的字符串数组中…

在Mac上搭建MongoDB环境

最近工作中需要装MongoDB环境&#xff0c;搭建过程中遇到了一些问题&#xff0c;在这里记录一下安装MongoDB环境的方法以及问题的解决方法。有两种安装MongoDB的方法&#xff1a;brew安装和手动安装。 目录 使用Homebrew安装MongoDB 手动安装MongoDB&#xff08;不使用Homebr…

WordPres Bricks Builder 前台RCE漏洞复现(CVE-2024-25600)

0x01 产品简介 Bricks Builder是一款用于WordPress的开发主题,提供直观的拖放界面,用于设计和构建WordPress网站。它使用户能够轻松创建自定义的网页布局和设计,无需编写或了解复杂的代码。Bricks Builder具有用户友好的界面和强大的功能,使用户可以通过简单的拖放操作添加…