在C++中,"哑元"、"内联函数"和"函数重载"是与函数设计和调用密切相关的三个概念,具体解释如下:
目录
1. 哑元(Dummy Argument/Parameter)
1. 哑元(Dummy Argument/Parameter)
在C++编程中,"哑元"这个术语虽然不常用,但可以理解为在函数定义或调用中使用的没有实际功能、仅作为占位符的参数。这种做法多见于模板编程或者为了匹配函数签名等场景。例如,在实现某些通用算法时,可能需要一个特定数量的参数来满足编译器要求,即使在特定情况下某些参数并不参与计算,这些参数就可以被视为哑元。
2. 内联函数(Inline Function)
内联函数是C++中的一种优化技术,通过inline
关键字指定。当函数被声明为内联时,编译器会尝试在调用该函数的地方直接展开函数体的代码,而不是执行常规的函数调用过程(压栈、跳转、返回)。这样做可以减少函数调用的开销,提高程序运行效率,尤其是在函数体较短、调用频繁的情况下更为有效。但是,是否真正内联取决于编译器的具体实现和优化策略。
3. 函数重载(Function Overloading)
函数重载允许在同一作用域内使用相同的函数名称定义多个函数,但这些函数的参数列表必须不同(即参数类型、个数或顺序不同)。编译器会根据传入的参数类型和个数自动选择合适的函数版本进行调用。这是C++支持多态性的一种方式,提高了代码的可读性和灵活性。
【1】函数重载概念
实现一名多用,节省同一功能的函数因为参数不同,需要定义多次并不同名的问题
函数重载,是静态多态的一种
【2】定义
- 函数名相同
- 形参不同,可以是个数不同也可以是类型不同
- 作用域相同
示例:
#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; }
- 编辑
- 函数的默认参数
函数参数的获取方式:
在调用函数时,获取传递过来的实参,(都是从主调函数处获取的)
C++中支持函数的默认参数:
在定义函数时,某一些形参有默认值,如果调用时有实参传过来,就使用实参的值,如果调用时,没有给该参数传参,参数就使用默认值。
默认参数的要求:必须遵循靠右原则
如果某一个参有默认参数,那该参数右侧的所有参数一定也有默认参数
因为函数传参时,遵循靠左原则
如果函数的定义和声明是分开的,默认参数只能出现在一个位置(尽量写在声明的位置)
函数重载和函数的默认参数同时出现:
- 同样的传参个数,既能满函数重载的需要,也能满足默认参数的需求,在调用时就会发生混乱,函数重载和默认参数不要同时出现
声明和定义不在同一位置: #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; }
- 哑元
函数中,某个参数只有数据类型,没有变量名,此刻该参数,就是哑元
哑元的参数,虽然在函数内获取不到,但是仍然传参
哑元的使用场合:
- 如果对于大型的程序,对某个功能进行更新,有需要保证代码的向下兼容(前面版本的代码仍然可以使用),就可以给某些参数设定为哑元。
- 运算符重载时,自增自减运算符的重载
#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; }
- 内联函数(inline)
内联函数的作用:
把函数体,在调用处展开
把inline关键字写在函数名前
优点:提高运行效率(函数调用没有压栈和出栈的过程)
缺点:造成代码膨胀
内联函数的要求:
- 函数被频繁的调用
- 函数体尽量小(小于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; }