函数:重载、默认参数与内联
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)交换两值。
八、总结与延伸
本节重点回顾
- 函数重载:同名不同参,C 不支持
- 默认参数:从右向左,声明处指定
- inline:建议内联,短小函数适用
- 函数模板:
template<typename T>泛型编程入门
下节预告
进入进阶阶段:《类与对象:面向对象基础》。
延伸阅读
- C 语言函数
- C++ 速查 §5 函数与重载
📌知识点卡片
- 重载:参数类型/个数不同;仅返回值不同无效
- 默认参数:void f(int a, int b = 0);
- template T func(T x);
下一篇见!