函数高阶
约 930 字大约 3 分钟
C++
2025-03-04
本文作者:程序员飞云
内联函数
C++为了提升运行速度做的优化。
函数让代码更加模块化,可重用性,可读性大大提高,但是函数执行需要一系列额外的操作,降低运行效率。
为了解决这个问题,C++11引入了内联函数概念。使用内联函数的时候,编译器不去做常规的函数调用,将调用点上内联展开,使用函数代码替代了函数调用。
内联函数定义
只需要在对应的函数里面加入inline

内联函数和宏
有点类似#dinfine定义的宏,但是C里面的宏无法进行传参,本质是文本替换
默认实参
调用函数的时候参数一般都会赋一个固定的值。
#include<iostream>
using namespace std;
#include<string>
string stuinfo(string name = "", int age = 18, double score = 100) {
string info = "学生姓名:" + name + "\t" + "学生年龄" + to_string(age) + "\t" + "分数:" + to_string(score);
return info;
}
int main() {
cout<<stuinfo()<<endl;
cout << stuinfo("test",22,76) << endl;
}

函数重载
同一个函数名可以定义多次,前提是参数列表不同。
const和重载

以上本质是值的拷贝,所以不算重载。

形参是常量引用,指向常量的指针,const限制了间接访问的数据对象是常量,是“底层const”,这时候也算是重载。
函数匹配

这里实际调用的是最后一个函数
(1) 候选函数
- 调用的函数名相同
- 函数的声明,调用点可用
(2) 可行函数
- 形参个数与调用传入的实参数量相同
- 每个实参的类型和形参的类型是匹配的
以上面的函数,第二个和第四个都是满足情况。
(3) 最佳匹配
形参和实参的类型最接近的,不需要转换的,优先使用。
所以以上默认采用第四个函数
(4) 多个参数函数匹配
- 可行函数的所有形参都能匹配
- 如果没有精确匹配,那么至少有一个参数类型转换的性能更高
(5) 二义性调用
如果有多个函数都匹配,那么编译器会报错。
函数指针
函数指针定义
之前的案例
string stuinfo(string name = "", int age = 18, double score = 100) {
string info = "学生姓名:" + name + "\t" + "学生年龄" + to_string(age) + "\t" + "分数:" + to_string(score);
return info;
}
函数指针定义
string(*fp)(string, int, double) = nullptr;
const string& longstr(const string& str1, const string& str2) {
return str1.size() > str2.size() ? str1 : str2;
}
定义
const string& (*longstr)(const string&, const string&);
函数指针的使用
fp = &stuinfo;
fp = stuinfo;
cout << fp("test", 1, 22) << endl;
cout << (*fp)("test", 1, 22) << endl;
函数指针作为实参
// 函数指针定义为形参
void selectstr(const string&, const string&, const string & (const string & str1, const string & str2));
void selectstr(const string&, const string&, const string & (*fp)(const string & str1, const string & str2));
void selectstr(const string&, const string&, const string & fp(const string & str1, const string & str2));
但是以上的代码还是过于烦琐了,我们可以使用函数别名来缩短代码。
函数别名
typedef const string& Func(const string& str1, const string& str2); // 函数类型
typedef const string& (*Funp)(const string& str1, const string& str2); // 函数指针类型
void selectstr(const string&, const string&, Func);
C++11特性decltype
// 提取函数类型
typedef decltype (longstr) Func2; // 函数类型
typedef decltype (longstr) *Func2; // 函数指针
void selectstr(const string&, const string&, Func2);
函数指针作为返回值
Func* fun(int);
//Func fun(int);错误
Funp fun2(int);
尾置返回类型
auto fun3(int) -> Funp;
贡献者
flycodeu
版权所有
版权归属:flycodeu