C++基础知识(三:哑元和内联函数和函数重载)

简介: 在C++编程中,"哑元"这个术语虽然不常用,但可以理解为在函数定义或调用中使用的没有实际功能、仅作为占位符的参数。这种做法多见于模板编程或者为了匹配函数签名等场景。例如,在实现某些通用算法时,可能需要一个特定数量的参数来满足编译器要求,即使在特定情况下某些参数并不参与计算,这些参数就可以被视为哑元。

 在C++中,"哑元"、"内联函数"和"函数重载"是与函数设计和调用密切相关的三个概念,具体解释如下:

目录

1. 哑元(Dummy Argument/Parameter)

2. 内联函数(Inline Function)

3. 函数重载(Function Overloading)

【1】函数重载概念

【2】定义

示例:


1. 哑元(Dummy Argument/Parameter)

在C++编程中,"哑元"这个术语虽然不常用,但可以理解为在函数定义或调用中使用的没有实际功能、仅作为占位符的参数。这种做法多见于模板编程或者为了匹配函数签名等场景。例如,在实现某些通用算法时,可能需要一个特定数量的参数来满足编译器要求,即使在特定情况下某些参数并不参与计算,这些参数就可以被视为哑元。

2. 内联函数(Inline Function)

内联函数是C++中的一种优化技术,通过inline关键字指定。当函数被声明为内联时,编译器会尝试在调用该函数的地方直接展开函数体的代码,而不是执行常规的函数调用过程(压栈、跳转、返回)。这样做可以减少函数调用的开销,提高程序运行效率,尤其是在函数体较短、调用频繁的情况下更为有效。但是,是否真正内联取决于编译器的具体实现和优化策略。

3. 函数重载(Function Overloading)

函数重载允许在同一作用域内使用相同的函数名称定义多个函数,但这些函数的参数列表必须不同(即参数类型、个数或顺序不同)。编译器会根据传入的参数类型和个数自动选择合适的函数版本进行调用。这是C++支持多态性的一种方式,提高了代码的可读性和灵活性。

【1】函数重载概念

实现一名多用,节省同一功能的函数因为参数不同,需要定义多次并不同名的问题

函数重载,是静态多态的一种

【2】定义

  1. 函数名相同
  2. 形参不同,可以是个数不同也可以是类型不同
  3. 作用域相同

示例

#include <iostream>
using namespace std;
//想要实现加法功能
int add(int a,int b)    //编译阶段   addii
{
    return a+b;
}
 
float add(float a,float b)   //编译阶段  addff
{
    return a+b;
}
int main()
{
    float a = 1.2,b=2.0;
    cout << add(3,5) << endl;
    cout << add(a,b) << endl;
    return 0;
}

image.gif

  • image.gif 编辑
  • 函数的默认参数

函数参数的获取方式:

在调用函数时,获取传递过来的实参,(都是从主调函数处获取的)

C++中支持函数的默认参数:

在定义函数时,某一些形参有默认值,如果调用时有实参传过来,就使用实参的值,如果调用时,没有给该参数传参,参数就使用默认值。

默认参数的要求:必须遵循靠右原则

如果某一个参有默认参数,那该参数右侧的所有参数一定也有默认参数

因为函数传参时,遵循靠左原则

如果函数的定义和声明是分开的,默认参数只能出现在一个位置(尽量写在声明的位置)

函数重载和函数的默认参数同时出现:

  1. 同样的传参个数,既能满函数重载的需要,也能满足默认参数的需求,在调用时就会发生混乱,函数重载和默认参数不要同时出现
声明和定义不在同一位置:
#include <iostream>
using namespace std;
namespace A {
    void fun(string str);
}
void A::fun(string str="hello")
{
    cout << str << endl;
}
int main()
{
    A::fun();
    return 0;
}
#include <iostream>
using namespace std;
float add(float a=8,float b=9,float c=9.1)   //编译阶段  addff
{
    return a+b+c;
}
float add(float a,float b)   //编译阶段  addff
{
    return a+b;
}
int main()
{
    float a = 0.2,b=0.7;
    //cout << add(3,5) << endl;  传两个参数既能满足只需要两个参数的add函数,也能满足有默认参数的add函数,会发生混乱
    cout << add() << endl;   //函数重载尽量不要和默认参数一起出现
    return 0;
}

image.gif

  • 哑元

函数中,某个参数只有数据类型,没有变量名,此刻该参数,就是哑元

哑元的参数,虽然在函数内获取不到,但是仍然传参

哑元的使用场合:

  1. 如果对于大型的程序,对某个功能进行更新,有需要保证代码的向下兼容(前面版本的代码仍然可以使用),就可以给某些参数设定为哑元。
  2. 运算符重载时,自增自减运算符的重载
#include <iostream>
using namespace std;
float add(float a,float,float d = 9.0)   //第二个参数是哑元
{
    return a;
}
int main()
{
    float a = 0.2,b=0.7;
    cout << add(a,b) << endl;   //b位置的形参是一个哑元,在函数内接收不到b的值
    return 0;
}

image.gif

  • 内联函数(inline)

内联函数的作用:

把函数体,在调用处展开

把inline关键字写在函数名前

优点:提高运行效率(函数调用没有压栈和出栈的过程)

缺点:造成代码膨胀    

内联函数的要求:

  1. 函数被频繁的调用
  2. 函数体尽量小(小于5行)

inline关键字只是给编译器的一个建议,如果加了inline关键字,但是编译器认为效率不会提高,就不会被展开成内联函数;如果编译器认为展开为内联函数会提高效率,是否加inline都会展开为内联函数。

#include <iostream>
using namespace std;
inline float add(float a,float)   //添加inline关键字,建议编译器展开为内联函数
{
    return a;
}
int main()
{
    float a = 0.2,b=0.7;
   
    cout << add(a,b) << endl;  //如果add被处理成一个内联函数,调用时就不是函数调用的过程
    //会把函数体在调用处展开,顺序执行的过程
    return 0;
}

image.gif

相关文章
|
2天前
|
C语言 C++ 开发者
C++基础知识(一:命名空间的各种使用方法)
C++在C的基础上引入了更多的元素,例如类,类的私密性要比C中的结构体更加优秀,引用,重载,命名空间,以及STL库,模板编程和更多的函数,在面向对象的编程上更加高效。C语言的优势则是更加底层,编译速度会更快,在编写内核时大多数都是C语言去写。 在C++中,命名空间(Namespace)是一种组织代码的方式,主要用于解决全局变量、函数或类的命名冲突问题。命名空间提供了一种封装机制,允许开发者将相关的类、函数、变量等放在一个逻辑上封闭的区域中,这样相同的名字在不同的命名空间中可以共存,而不会相互干扰。
|
21天前
|
存储 编译器 C语言
【C++入门】—— C++入门 (下)_内联函数
【C++入门】—— C++入门 (下)_内联函数
13 2
|
2天前
|
C++
C++基础知识(二:引用和new delete)
引用是C++中的一种复合类型,它是某个已存在变量的别名,也就是说引用不是独立的实体,它只是为已存在的变量取了一个新名字。一旦引用被初始化为某个变量,就不能改变引用到另一个变量。引用的主要用途包括函数参数传递、操作符重载等,它可以避免复制大对象的开销,并且使得代码更加直观易读。
|
2天前
|
C++
C++基础知识(四:类的学习)
类指的就是对同一类对象,把所有的属性都封装起来,你也可以把类看成一个高级版的结构体。
|
2天前
|
自然语言处理 程序员 C++
C++基础知识(五:运算符重载)
运算符重载是C++中的一项强大特性,它允许程序员为自定义类型(如类或结构体)重新定义标准运算符的行为,使得这些运算符能够适用于自定义类型的操作。这样做可以增强代码的可读性和表达力,使得代码更接近自然语言,同时保持了面向对象编程的封装性。
|
2天前
|
存储 编译器 C++
C++基础知识(六:继承)
多态是面向对象编程的四大基本原则之一,它让程序能够以统一的接口处理不同的对象类型,从而实现了接口与实现分离,提高了代码的灵活性和复用性。多态主要体现在两个层面:静态多态(编译时多态,如函数重载)和动态多态(运行时多态,主要通过虚函数实现)。
|
2天前
|
存储 编译器 C++
C++基础知识(七:多态)
多态是面向对象编程的四大基本原则之一,它让程序能够以统一的接口处理不同的对象类型,从而实现了接口与实现分离,提高了代码的灵活性和复用性。多态主要体现在两个层面:静态多态(编译时多态,如函数重载)和动态多态(运行时多态,主要通过虚函数实现)。
|
2天前
|
存储 算法 程序员
C++基础知识(八:STL标准库(Vectors和list))
C++ STL (Standard Template Library标准模板库) 是通用类模板和算法的集合,它提供给程序员一些标准的数据结构的实现如 queues(队列), lists(链表), 和 stacks(栈)等. STL容器的提供是为了让开发者可以更高效率的去开发,同时我们应该也需要知道他们的底层实现,这样在出现错误的时候我们才知道一些原因,才可以更好的去解决问题。
|
2天前
|
算法 前端开发 C++
C++基础知识(八:STL标准库 deque )
deque在C++的STL(Standard Template Library)中是一个非常强大的容器,它的全称是“Double-Ended Queue”,即双端队列。deque结合了数组和链表的优点,提供了在两端进行高效插入和删除操作的能力,同时保持了随机访问的特性。
|
2天前
|
存储 C++ 索引
C++基础知识(八:STL标准库 Map和multimap )
C++ 标准模板库(STL)中的 map 容器是一种非常有用的关联容器,用于存储键值对(key-value pairs)。在 map 中,每个元素都由一个键和一个值组成,其中键是唯一的,而值则可以重复。

热门文章

最新文章