Javer 学 c++(十四):函数高级篇

43 阅读3分钟

总览

主要讲了 c++ 中函数的默认/占位参数以及函数重载的基本语法和注意事项

函数默认参数

在 c++中,函数的形参列表中的形参是可以有默认值的

语法:返回值类型 函数名 (参数=默认值) {}

这块感觉和 python 相似,python 中有这样的语法,没记错的话是基于 default 元组实现的;

Java 是不支持的,可以用重载来实现,不知道后续是否会增加(提个 issue 试试hh)

todo:后续学习深入了之后,看下 c++ 这块怎么实现的

#include <iostream>
using namespace std;

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

// 如果某个参数已经有了默认值,那么从这个参数开始后续的都需要有默认值
int sum1(int a, int b = 20, int c = 30) {
    return a + b + c;
}

// 默认参数不允许重定义,编译器不知道该用哪个
// 声明和实现只能有一个定义默认参数
int sum3(int a = 10, int b = 20); // 声明

int sum3(int a, int b) { // 实现
    return a + b;
}

int main() {
    // 60
    cout << sum(10, 20, 30) << endl;
    // 60
    cout << sum1(10) << endl;

    return 0;
}

函数占位参数

c++中形参列表中可以有占位参数,用来做占位,调用的时候必须填补该位置

语法:返回值类型 函数名(数据类型){}

#include <iostream>
using namespace std;

// 1. 目前阶段占位参数用不到,因为传的 50在函数里根本拿不到
// 2. 占位参数可以有默认参数
int sum(int a, int = 20) {
   return a;
}

int main() {
   
   cout << sum(10, 50) << endl;

   return 0;
}

函数重载

概述

作用:函数名可以相同,参数不同,可以根据参数的类型和数量为函数提供不同的语义

本质上还是抽象,因为必然存在一些功能可以允许不同的参数,比如 add 相加,相加可以是数字也可以是自定义的类型,但是抽象来看其实都是加的这一个概念。如果没有重载,就需要有很多命名的函数,比如 add_int,add_double,add_xxx

条件

  1. 同一个作用域下
  2. 函数名称相同
  3. 参数的类型不同或者参数的数量不同

和 Java 的定义完全一致

#include <iostream>
using namespace std;

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

int sum(int a, int b) {
    return a + b;
}

int sum(int a) {
    return a;
}

int main() {

    cout << sum(10, 50) << endl;
    cout << sum(10.2, 5.3) << endl;
    cout << sum(10) << endl;

    return 0;
}

注意事项

  1. 引用作为重载条件:int 和 const int 是两种类型
#include <iostream>
using namespace std;

// 函数重载的注意事项
// 1. 引用作为重载参数
void add(int &a) {
    cout << "调用非 const" << endl;
}

void add(const int &a) {
    cout << "调用 const" << endl;
}

int main() {
    // int 和 const int 是两种类型
    int a = 10;
    const int b = 10;
    // 调用的是非 const
    add(a);
    // 调用的是 const
    add(10); 
    add(b);
    
    return 0;
}
  1. 函数重载碰到默认参数
#include <iostream>
using namespace std;

void add(int a, int b = 10) {
    cout << "调用1" << endl;
}

void add(int a) {
    cout << "调用2" << endl;
}

int main() {

    add(1); // 此时不能确定是调用 1 还是 2,所以判断函数是否重载,需要将默认参数排除在外

    return 0;
}