C++——函数

1.0 默认参数

在 C 语言 中,函数的参数必须由实参传递。而在 C++ 中,允许给函数的参数提供默认值

默认值的规则

默认值的规则

  • 调用函数时,传递了实参,就使用实参的值。
  • 没有传递实参时,使用默认值。

注意事项:

  1. 默认参数必须遵循靠右原则,即从左往右连续的参数可以有默认值,靠左的参数不能有默认值,否则会引发歧义。
  2. 默认参数只能在声明处提供,不能同时在定义处重复默认参数

示例代码

#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 关键字。

    要求

  1. 内联函数必须写在头文件(.h)。
  2. 函数体要尽量简短,太大的函数不适合做内联。
// 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、内联函数本质也是函数,有函数的属性,也对函数的类型做检查,而宏定义只是简单的无脑替换

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值