本文介绍: 回顾函数重载引用和宏。

函数重载

概念

C++允许同一作用域声明几个功能类似的同名函数。这些同名函数的行参列表,即参数个数类型类型顺序不同。常用来处理实现功能类似但是数据类型不同的问题

名字修饰

C++支持函数重载,其原理就是名字修饰

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

首先,一个运行运行起来,要经过预处理->编译->汇编->链接这几个阶段

在C++中,链接阶段每个编译器都有自己的函数名修饰规则编译器会根据形参的类型、个数顺序来对函数进行修饰。C++会根据这些对函数进行修饰,得到了新的函数名,而C语言修饰后,还是函数名本身。

extern “C”(extern “C”_百度百科

虽然C++是C的超集,但是,它们之间的编译器是不同的,这就产生了各自的编译器在对C和C++进行编译时要依据哪一个作为大家都认可的规范或者约定的问题

extern “C”的主要作用就是为了能够正确实现C++代码调用其他C语言代码。加上extern “C”后,会指示编译器部分代码按C语言的进行编译,而不是C++的。

由于C++支持函数重载,因此编译器编译函数的过程中会将函数的参数类型也加到编译后的代码中,而不仅仅是函数名;而C语言并不支持函数重载,因此编译C语言代码的函数时不会带上函数的参数类型,一般只包括函数名。

引用

概念

引用不是新定义一个变量,而是给已经存在了的变量一个别名。编译器不会为引用变量开辟内存空间,它和它的引用变量共用一块内存空间

引用类型必须和引用实体是同种类型的。

特性

引用必须在定义初始化

一个变量可以多个引用

引用一单引用一个实体,就不能再引用其它实体

使用场景

参数

返回值

如果函数返回时出了函数作用域对象存在可以用引用返回,如果对象已经不存在了就必须用传值返回

传值和传引用的效率

用值作为参数返回值类型效率非常底下,尤其是数据量很大或很多时。因为:以值作为参数或者返回值类型时,在传参和返回期间,函数不会直接传递实参或者将变量本身直接返回,而是传递实参或者返回变量的一份临时拷贝

引用和指针区别

首先在语法概念上,引用是别名,没用独立空间,和它的引用实体共用一块空间。但是在底层实现上,它是有空间的,引用是按照指针方式实现的。

指针和引用的不同点:

引用概念定义一个变量的别名,指针存储一个变量地址

引用在定义时必须初始化,指针没有要求。

引用在初始化时引用一个实体后,就不能再引用其它实体,而指针,可以在任何时候任何一个同类型的实体。

没有NULL引用,但是有NULL指针。

sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节数。

引用自加即引用的实体增加1,指针自加则指针只向后偏移一个类型的大小

指针有多级指针,但是引用没有

访问实体的方式不同,指针需要显式解引用,而引用由编译器自己处理

引用比指针使用起来相对安全

宏的优缺点

优点:

增强代码的复用性。

高性能

缺点:

不方便调试宏(因为预处理阶段进行了替换)。

导致代码可读性差,可维护性差,容易误用。

没有类型安全检查

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

使用const enum inline

nullptr

C++98中的空指针

NULL其实是一个宏,NULL可能定义字面常量0,或者被定义为无类型指针(void*)的常量。由于NULL被定义为0,所以假使某个函数参数为指针,想要把NULL作为参数去调用这个函数,在运行可能会与程序的初衷相悖。

在C++98中,字面常量0既可以是一个整型数字,也可以是无类型的指针(void*)常量,但是编译器默认情况下将其看成是一个整型常量,如果要将其按照指指针方式来使用,必须对其进行强转(void*)0。

在使用nullptr表示空指针时,不需要包含头文件,因为nullptr是C++11作为新关键字引入的。

在C++11中。sizeof(nullptr)与sizeof((void*)0)所占的字节数相同。

为了提高代码的健壮性,在后续表示指针空值建议最好使用nullptr

原文地址:https://blog.csdn.net/m0_60464690/article/details/134735187

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_26730.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注