1.0 默认参数
在 C 语言 中,函数的参数必须由实参传递。而在 C++ 中,允许给函数的参数提供默认值。
默认值的规则
默认值的规则:
- 调用函数时,传递了实参,就使用实参的值。
- 没有传递实参时,使用默认值。
注意事项:
- 默认参数必须遵循靠右原则,即从左往右连续的参数可以有默认值,靠左的参数不能有默认值,否则会引发歧义。
- 默认参数只能在声明处提供,不能同时在定义处重复默认参数
示例代码
#include <iostream>
#include <string>
using namespace std;
void func_1(int val_1 = 10)
{
cout<<val_1<<endl;
}
void func_2(int val_1 , int val_2 = 10);
void func_2(int val_1 , int val_2)
{
cout << val_1 << endl;
}
int main(int argc, char const *argv[])
{
func_2(10);
return 0;
}
2.0 函数哑元
占位参数
占位参数是在函数形参列表中出现,但没有具体使用的参数。它在某些情况下可以作为一种占位符,使函数的调用更加灵活。
- 在定义函数时,可以为某个或多个参数指定类型,但不需要给出参数名。
- 占位参数仅用于占位,没有其他实际意义,但调用时必须填补占位参数。
语法
占位参数是在函数形参列表中出现,但没有具体使用的参数。
返回值类型 函数名 (数据类型) {}
#include <iostream>
using namespace std;
// 函数带占位参数,占位参数没有使用
void func(int a, int) {
cout << "this is func" << endl;
}
int main() {
func(10, 10); // 占位参数必须传递值
return 0;
}
this is func
3.0函数重载
3.0.1 函数重载概念
当我们在封装功能相同、用法相同的函数时,只是因为参数的不同,就需要定义多个版本的函数。为了避免函数名重复导致的不便,C++ 提供了函数重载功能。
允许定义多个同名的函数,但参数列表必须不同。参数类型不一样,函数名字相同
3.0.2函数重载的要求
1、同一个作用域下
2、函数名相同,形参列表必须不同。
-
类型不同
-
个数不同
-
顺序不同
3、函数重载对返回值没有要求。
注意: 函数的返回值不可以作为函数重载的条件。
代码示例
#include <iostream>
#include <string>
using namespace std;
void Swap_Func(int & val_1 , int &val_2)
{
int temp = val_2;
val_2 = val_1;
val_1 = temp;
}
void Swap_Func(double & val_1 ,double & val_2)
{
double temp = val_2;
val_2 = val_1;
val_1 = temp;
}
int main(int argc, char const *argv[])
{
int val_int_1 = 50;
int val_int_2 = 70;
double val_double_1 = 50.123;
double val_double_2 = 70.123;
Swap_Func(val_int_1 , val_int_2);
Swap_Func(val_double_1 , val_double_2);
cout << val_int_1 << " " << val_int_2 << endl;
cout << val_double_1 << " " << val_double_2 << endl;
return 0;
}
3.0.3函数重载的注意事项
引用作为重载条件:在 C++ 中,引用可以作为函数重载的条件。通过区分左值引用和 const
引用,编译器可以根据传递的参数是左值还是右值来选择合适的函数。
#include <iostream>
#include <string>
using namespace std;
void Swap_Func(int & val_1 , int &val_2)
{
int temp = val_2;
val_2 = val_1;
val_1 = temp;
}
void Swap_Func(int & val_1 , int &val_2 , int val = 10)
{
int temp = val_2;
val_2 = val_1;
val_1 = temp;
}
void Func( const int & val )
{
cout << "我是一号" << val << endl;
}
void Func( int & val )
{
cout << "我是二号" << val << endl;
}
int main(int argc, char const *argv[])
{
int val_int_1 = 50;
int val_int_2 = 70;
Swap_Func(val_int_1 , val_int_2 , 10);
Func(50);
return 0;
}
student@student-machine:~/www1/c++学习文件/函数$ g++ 函数重载02.cpp
student@student-machine:~/www1/c++学习文件/函数$ ./a.out
我是一号50
student@student-machine:~/www1/c++学习文件/函数$
函数重载碰到函数默认参数
当函数重载遇到默认参数时,可能会产生二义性。编译器在调用函数时可能无法决定应该调用带默认参数的重载版本,还是另一个参数匹配的重载版本,因此会报错。
#include <iostream>
using namespace std;
void func2(int a, int b = 10) {
cout << "func2(int a, int b = 10) 调用" << endl; // 带默认参数的函数
}
void func2(int a) {
cout << "func2(int a) 调用" << endl; // 无默认参数的函数
}
int main() {
// func2(10); // 这行代码会产生二义性
func2(10, 20); // 直接传递两个参数,明确调用两个参数的版本
return 0;
}
4.0内联函数
定义方法:在函数前加上 inline
关键字。
要求
- 内联函数必须写在头文件(.h)。
- 函数体要尽量简短,太大的函数不适合做内联。
// func.h
inline int my_add(int a, int b) {
return a + b;
}
// main.cpp
#include <iostream>
#include "func.h"
int main() {
int a = my_add(20, 30); // 调用内联函数
std::cout << a << std::endl; // 输出50
return 0;
}
内联函数和宏的区别
1、宏定义是在预处理阶段完成替换,内联函数是在编译阶段处理的
2、内联函数本质也是函数,有函数的属性,也对函数的类型做检查,而宏定义只是简单的无脑替换