【C++】基础知识点回顾 中:函数重载、引用和内联函数

简介: 【C++】基础知识点回顾 中:函数重载、引用和内联函数

前言

上篇文章我们介绍了C++基础知识中的命名空间、输入输出语句和缺省参数,

上篇文章点击这里

今天,我们就来学习函数重载与引用

函数重载

定义

在编写代码时,当出现多个函数名相同的函数时,C++提供了一种方式,函数重载,使得当人们想使用哪个函数时,就调用哪个函数

它允许我们在同一个作用域声明多个同名函数,但这些函数的参数类型或参数个数不同或参数顺序不同。

通过函数重载,我们可以用相同的函数名来表示不同的操作,从而提高代码的灵活性和可读性。

类型介绍

下面给出一些例子:

函数参数个数不同

int add(int a, int b, int c)
{
  return a + b + c;
}
int add(int a, int b)
{
  return a + b;
}

函数参数类型不同

int add(int a, int b, int c)
{
  return a + b + c;
}
int add(int a, double b, int c)
{
  return a + b + c;
}

函数参数顺序不同

int add(int b, double a, int c)
{
  return a + b + c;
}
int add(double a, int b, int c)
{
  return a + b + c;
}

注意:

我们并不考虑函数的返回类型是否不同

原因在后面会解释

重载规则

名称修饰

虽然看起来,上面那些函数的名称是一样的,但在编译过程中,编译器会根据这个函数的函数名和它的参数列表编码形成一个唯一的字符串,来表示这个函数。

这样,相同的函数名在编译后会变得不同,因此可以区分函数重载。

参数匹配

在编译时,编译器会根据传入的参数个数和类型来寻找合适的函数

函数调用解析

一旦编译器匹配到合适的函数声明,它就会生成对应的函数调用。

由于名称修饰的作用,函数的实际调用名可能与源代码中的函数名不完全相同。

注意

名称修饰的具体方式和规则在不同的编译器中可能有所不同,这也导致了不同编译器对函数重载的处理方式可能略有差异。

为了保持向后兼容性,C++提供了extern "C"的机制,用于在C++代码中声明使用C语言的函数名称修饰方式

导入

在学习C++一段时间之后,相信大家都接触到了引用,我们会发现,它和指针很像,这里就做一个对比

指针

我们都知道,指针实际上指的是指针变量,只不过我们口头说成指针而已,

指针就是地址,指针变量存放的就是一个地址

下面给出几个简单的应用示例

int *p = NULL;
 int a = 0;
 int *pa = &a;

注意点

多提一句,对于野指针,也就是指向未知空间的指针变量,对它进行解引用操作是非法的

更详细的介绍,可以看我的另一篇文章

C语言知识点之指针

引用

下面,我们就来学习什么是引用

定义

引用不是新创建一个变量,而是对于已经存在的变量进行重命名,

编译器不会再单独为引用开辟一块空间,而是将引用和它所引用的变量存储到同一块空间里

格式

类型 &引用名 = 要引用的变量名;

下面给出一个例子

int a = 0;
  int& b = a;

提示:

上面代码中的a和b是同一个变量,改变a就是改变b、改变b就是改变a

注意

引用和被引用的变量的类型要相同

引用的特性

1.引用为变量提供了一个别名。通过引用,我们可以使用不同的名称来访问同一个变量。

2.C++要求引用在声明时必须进行初始化,并且一旦初始化后就不能再改变其引用的对象

3.引用本身并不占用内存空间,它只是变量的一个别名。所以无法对引用获取地址

4. 引用在函数参数传递中特别有用,它可以通过引用来传递参数,以实现函数内部对参数的修改对原始变量的影响

引用和指针的区别

1.初始化和重新绑定:引用在声明时必须进行初始化,并且一旦初始化后就不能重新绑定到其他变量。而指针可以不进行初始化,并且可以重新指向其他变量。

2.空引用:C++不允许创建空引用,即引用必须绑定到一个已经存在的对象。但是,指针可以指向空(nullptr)。

3.语法:引用使用&符号进行声明,指针使用*符号进行声明。

4.内存占用:引用本身不占用额外的内存空间,而指针需要存储目标对象的地址,占用一定的内存空间。

常引用

常引用(const reference)是引用的一种特殊类型,在C++中用于限制通过引用访问的对象的修改。

通过将引用声明为常引用,我们告诉编译器,引用所指向的对象是只读的,不允许通过引用对对象进行修改。

常引用通过在引用声明中添加const关键字来实现,其声明形式为:

const T& ref = 引用实体;
//T是要引用的对象类型

特点

只读访问:通过常引用,我们只能读取所引用对象的值,不能修改它。任何试图通过常引用修改对象的操作都会导致编译错误。

初始化要求:常引用必须在声明时进行初始化,且只能引用一个同类型的变量或常量。

临时对象:常引用可以绑定到临时对象(右值),但由于临时对象在表达式结束后会被销毁,因此只能访问临时对象的值,不能修改。

应用

1.函数参数传递:通过引用传递参数,可以实现函数内部对原始变量的修改。简化使用指针。

void increment(int& x) {
    x++;
}
int num = 10;
increment(num);
// 现在num的值为11

2.返回值:函数可以通过引用返回结果,避免创建临时变量。

int& findLargest(int& a, int& b) {
    return (a > b) ? a : b;
}
int a = 10, b = 15;
int& largest = findLargest(a, b);
largest = 20;
// 现在b的值为20,即largest为b的引用

3.避免复制:引用可以避免对象的复制,提高代码的执行效率。

void processLargeObject(const LargeObject& obj) {
    // 处理大对象的操作,不需要复制对象
}

此处使用了常引用,代表在函数内不会对对象进行修改。

注意

在第二点做返回值时,要注意不能将临时变量引用返回

int& fun()

{

int a = 10;

return a;

}

例如此代码,变量a在函数执行结束之后便会被立刻销毁,若此时仍然根据引用去当作别名使用,对导致结果的不确定性,是不合法的操作。

内联函数

对于内联函数的介绍,可以看我之前的一篇文章

内联函数与快速读入

结语

关于函数重载、引用和内联函数的学习和介绍到这里就结束了,希望能对你有帮助。我们下次见~


相关文章
|
23天前
|
程序员 C++
C++中的函数重载有什么作用
【10月更文挑战第19天】C++中的函数重载有什么作用
17 3
|
1月前
|
存储 安全 编译器
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值(一)
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值
|
23天前
|
编译器 程序员 C++
C++中的函数重载是什么
【10月更文挑战第19天】C++中的函数重载是什么
18 0
|
1月前
|
存储 编译器 程序员
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值(二)
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值
|
1月前
|
自然语言处理 编译器 Linux
【C++】巧用缺省参数与函数重载:提升编程效率的秘密武器
【C++】巧用缺省参数与函数重载:提升编程效率的秘密武器
|
1月前
|
程序员 C++ 开发者
C++入门教程:掌握函数重载、引用与内联函数的概念
通过上述介绍和实例,我们可以看到,函数重载提供了多态性;引用提高了函数调用的效率和便捷性;内联函数则在保证代码清晰的同时,提高了程序的运行效率。掌握这些概念,对于初学者来说是非常重要的,它们是提升C++编程技能的基石。
21 0
|
3月前
|
编译器 程序员 C语言
C++函数重载
在实际开发中,有时候我们需要实现几个功能类似的函数,只是有些细节不同。例如希望交换两个变量的值,这两个变量有多种类型,可以是 int、float、char、bool 等,我们需要通过参数把变量的地址传入函数内部。在C语言中,程序员往往需要分别设计出三个不同名的函数,其函数原型与下面类似: void swap1(int *a, int *b); //交换 int 变量的值 void swap2(float *a, float *b); //交换 float 变量的值 void swap3(char *a, char *b); //交换 char 变量的
C++函数重载
|
3月前
|
编译器 Linux C语言
【C++小知识】为什么C语言不支持函数重载,而C++支持
【C++小知识】为什么C语言不支持函数重载,而C++支持
|
3月前
|
安全 编译器 C++
C++入门 | 函数重载、引用、内联函数
C++入门 | 函数重载、引用、内联函数
32 5
|
2月前
|
C语言 C++
C++(三)内联函数
本文介绍了C++中的内联函数概念及其与宏函数的区别。通过对比宏函数和普通函数,展示了内联函数在提高程序执行效率方面的优势。同时,详细解释了如何在C++中声明内联函数以及其适用场景,并给出了示例代码。内联函数能够减少函数调用开销,但在使用时需谨慎评估其对代码体积的影响。