函数:重载、默认参数与内联

📅 2026/7/21 7:04:55 👁️ 阅读次数 📝 编程学习
函数:重载、默认参数与内联

函数:重载、默认参数与内联

C++ 函数的扩展能力

在 C 语言函数 中,我们学习了函数定义、参数传递、返回值与递归。C++ 在此基础上增加了函数重载默认参数inline函数模板,使函数更加灵活强大。


一、C 函数基础(链接)

C++ 完全支持 C 风格函数:定义、调用、值传递、指针传递、返回值、递归等。

详见 C 第 09 篇。

C++ 推荐:大对象用const T&传递,避免拷贝(见 第 04 篇)。


二、函数重载

同一作用域内,函数名相同但参数列表不同(类型或个数),编译器根据实参选择匹配版本:

#include<iostream>intadd(inta,intb){returna+b;}doubleadd(doublea,doubleb){returna+b;}intadd(inta,intb,intc){returna+b+c;}intmain(){std::cout<<add(1,2)<<std::endl;// 调用 int 版std::cout<<add(1.5,2.5)<<std::endl;// 调用 double 版std::cout<<add(1,2,3)<<std::endl;// 调用三参数版return0;}

重载规则:

  • 仅返回值不同不能构成重载
  • 参数个数或类型必须不同
  • C 不支持重载,C++ 支持

三、默认参数

函数参数可指定默认值,调用时可省略:

#include<iostream>voidgreet(conststd::string&name,conststd::string&prefix="Hello"){std::cout<<prefix<<", "<<name<<"!"<<std::endl;}intmain(){greet("Alice");// Hello, Alice!greet("Bob","Hi");// Hi, Bob!return0;}

规则:

  • 默认参数从右向左连续:void f(int a, int b = 0, int c = 0);合法
  • 默认参数在声明中指定(定义中可省略)
  • 默认参数与重载配合使用需谨慎,避免歧义

四、inline 函数

inline建议编译器将函数体 inline 展开,减少调用开销(适用于短小的频繁调用函数):

inlineintsquare(intx){returnx*x;}
  • 定义通常放在头文件中
  • 现代编译器会自动 inline,显式inline更多是 ODR 相关
  • 类内定义的成员函数默认为 inline

五、函数模板(初探)

编写与类型无关的函数,编译器根据实参类型生成具体版本:

#include<iostream>template<typenameT>Tmaximum(T a,T b){return(a>b)?a:b;}intmain(){std::cout<<maximum(3,5)<<std::endl;// intstd::cout<<maximum(3.14,2.71)<<std::endl;// doublereturn0;}

模板详解见 第 12 篇。


六、constexpr 函数(C++11)

编译期可求值的函数:

constexprintfactorial(intn){return(n<=1)?1:n*factorial(n-1);}intarr[factorial(5)];// 120 元素数组,编译期确定

七、实战练习

练习1:重载 print

编写print(int)print(double)print(const std::string&)三个重载。

练习2:默认参数

编写void draw(char ch = '*', int count = 5),打印 count 个 ch。

练习3:函数模板

编写模板函数swap(T& a, T& b)交换两值。


八、总结与延伸

本节重点回顾

  1. 函数重载:同名不同参,C 不支持
  2. 默认参数:从右向左,声明处指定
  3. inline:建议内联,短小函数适用
  4. 函数模板template<typename T>泛型编程入门

下节预告

进入进阶阶段:《类与对象:面向对象基础》。

延伸阅读

  • C 语言函数
  • C++ 速查 §5 函数与重载

📌知识点卡片

  • 重载:参数类型/个数不同;仅返回值不同无效
  • 默认参数:void f(int a, int b = 0);
  • template T func(T x);

下一篇见!