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

news2024/12/31 4:00:02


目录

(一)内联函数

 (二)关键字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)


完~

未经作者同意禁止转载

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

怎样开发Apple Vision Pro应用?以应用开发者角度体验苹果的开发文档

▲ 搜索“大龙谈智能内容”关注公众号▲ 最近&#xff0c;苹果公司推出了革命性的产品Apple Vision Pro&#xff0c;全世界震惊。下边这个视频在社交网络上得到了大量转发&#xff1a; 在大家兴奋的围观之际&#xff0c;已经有人在规划能做些什么了。 有朋友问大龙有什么Vi…

妨碍做出正确决策的5种认知谬误

人类的大脑在极端情况下会呈现出不可理喻的一面&#xff0c;从而妨碍我们做出正确的决策。本文介绍了5种常见的认知谬误&#xff0c;识别并克服这些认知谬误&#xff0c;可以帮助我们更好的决策。原文: Want to Make Better Decisions? Avoid These 5 Cognitive Distortions 我…

Python中类创建和实例化过程

嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 一、 type() 1、创建类的两种方式 方式一 class MyClass(object):def func(self,name):print(name)myc MyClass()print(MyClass, type(MyClass)) print(myc, type(myc))我们创建了一个名为MyClass的类&#xff0c;并实例化…

书生·浦语大模型实战营-第四课笔记

期待已久的微调课 一、Finetune 增量预训练和指令跟随是两种微调模式&#xff0c;即两种微调策略。 1&#xff09;增量预训练 投喂新的领域知识即可&#xff0c;例如书籍、文章、代码 2&#xff09;指令跟随 采用高质量对话和问答数据进行训练 二、LoRA与QLoRA 两…

35、IO进程线程/多线程实现文件读写20240221

一、使用多线程完成两个文件的拷贝&#xff0c;第一个线程拷贝前一半&#xff0c;第二个线程拷贝后一半&#xff0c;主线程回收两个线程的资源。 代码&#xff1a; #include<myhead.h> typedef struct //类型重定义结构体 {const char *src;const char *dest;int start…

vue3总结

1 setup 概述 setup是Vue3中一个新的配置项个函数, 包含数据、方法等&#xff0c;是组合api的“舞台”。 特点如下&#xff1a; setup函数返回的对象中的内容&#xff0c;可直接在模板中使用。setup中访问this是undefined。setup函数会在beforeCreate之前调用&#xff0c;它…

人工智能深度学习

目录 人工智能 深度学习 机器学习 神经网络 机器学习的范围 模式识别 数据挖掘 统计学习 计算机视觉 语音识别 自然语言处理 机器学习的方法 回归算法 神经网络 SVM&#xff08;支持向量机&#xff09; 聚类算法 降维算法 推荐算法 其他 机器学习的分类 机器…

Spring Cloud Gateway 中文文档

Spring Cloud Gateway 中文文档 官方文档 该项目提供了一个建立在Spring Ecosystem之上的API网关&#xff0c;包括&#xff1a;Spring 5&#xff0c;Spring Boot 2和Project Reactor。 Spring Cloud Gateway旨在提供一种简单而有效的方式来对API进行路由&#xff0c;并为他们提…

奇异递归模板模式应用5-静态多态

动态多态&#xff1a;C动态多态是利用虚函数特性实现的&#xff0c;即基类指针(引用&#xff09;指向派生类指针(引用)。由于虚函数的实现是在运行期进行的&#xff0c;因而会产生运行期开销&#xff08;虚表指针偏移&#xff0c;与分支预测器和CPU指令流水线相关&#xff09;。…

window10中安装Docker Desktop(2024最新)

1、安装概述? 博客创造时间:2024年2月20日。 Docker在Linux中的安装相对较简单,但是在window中的安装总是会出现很多的问题。 新版本Docker Desktop安装的前提条件: 1、现在Docker Desktop默认使用WSL 2,而不是以前的Hyper-V。 2、检查系统要求:系统最好是Windows 1…

UE4 C++联网RPC教程笔记(三)(第8~9集)完结

UE4 C联网RPC教程笔记&#xff08;三&#xff09;&#xff08;第8~9集&#xff09;完结 8. exe 后缀实现监听服务器9. C 实现监听服务器 8. exe 后缀实现监听服务器 前面我们通过蓝图节点实现了局域网连接的功能&#xff0c;实际上我们还可以给项目打包后生成的 .exe 文件创建…

【优选算法专栏】专题九:链表--------两两交换链表中的节点

本专栏内容为&#xff1a;算法学习专栏&#xff0c;分为优选算法专栏&#xff0c;贪心算法专栏&#xff0c;动态规划专栏以及递归&#xff0c;搜索与回溯算法专栏四部分。 通过本专栏的深入学习&#xff0c;你可以了解并掌握算法。 &#x1f493;博主csdn个人主页&#xff1a;小…

华清远见作业第四十天——Qt(第二天)

思维导图&#xff1a; 编程&#xff1a; 使用手动连接&#xff0c;将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中&#xff0c;在自定义的槽函数中调用关闭函数 将登录按钮使用qt5版本的连接到自定义的槽函数中&#xff0c;在槽函数中判断ui界面上输入的账号是否为…

智慧园区软件解决方案,园区运营管理系统(源码)

一、楼栋管理 1、园区信息&#xff1a;描述园区信息&#xff0c;有些规模较大的产业园区会存在A区&#xff0c;B区&#xff0c;C区。 2、楼栋信息&#xff1a;管理园区所有的楼栋&#xff0c;设有楼栋编号&#xff0c;所属园区&#xff0c;楼栋地址等。 3、房源信息&#xf…

JAVA并发编程之原子性、可见性与有序性

并发编程-原子性、可见性与有序性 一、CPU的可见性 1.1 缓存一致性问题的出现 CPU处理器在处理速度上&#xff0c;远胜于内存&#xff0c;主内存执行一次内存的读写操作&#xff0c;所需要的时间足够处理器去处理上百条指令。 为了弥补处理器与主内存处理能力之间的差距&am…

计算机网络基础之计算机网络组成与分类

计算机网络基础 计算机网络是计算机技术与通信技术发展相结合的产物&#xff0c;并在用户需求的促进下得到进一步的发展。通信技术为计算机之间的数据传输和交换提供了必需的手段&#xff0c;而计算机技术又渗透到了通信领域&#xff0c;提高了通信网络的性能。 计算机网络的…

书生·浦语大模型实战营-第六课笔记

1.评测追魂夺命三连问 2.主流大拿有话说-评测框架 3.友商最棒儿子最亲&#xff0c;好瓜都是王婆的 4.真枪实弹上战场 为了给平台省点电&#xff0c;我用了自家的电和自家的电脑进行评测。评测的模型也是之前在自己电脑上跑了3轮花费30多个小时的第四课作业微调的法律大模型。s…

Kotlin学习 6

1.接口 interface Movable {var maxSpeed: Intvar wheels: Intfun move(movable: Movable): String}class Car(var name: String, override var wheels: Int 4, _maxSpeed: Int) : Movable {override var maxSpeed: Int _maxSpeedget() fieldset(value) {field value}overr…

相机图像质量研究(40)常见问题总结:显示器对成像的影响--画面泛白

系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结&#xff1a;光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结&#xff1a;光学结构对成…

过减速带控制效果优化

一、忽略纵向和横向的影响 如上图所示&#xff0c;车辆以40km/h过减速带时&#xff0c;质心垂向加速度突然变化的同时&#xff0c;纵向加速度与侧向加速度也会引起突变。 我们在之前文章里提到&#xff0c;侧向控制与纵向控制是根据侧向加速度与纵向加速度来做的&#xff0c;因…