C++入门基础_C++回顾

函数重载

概念

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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值