Skip to content

函数高阶

约 930 字大约 3 分钟

C++

2025-03-04

本文作者:程序员飞云

本站地址:https://www.flycode.icu

内联函数

C++为了提升运行速度做的优化。

函数让代码更加模块化,可重用性,可读性大大提高,但是函数执行需要一系列额外的操作,降低运行效率。

为了解决这个问题,C++11引入了内联函数概念。使用内联函数的时候,编译器不去做常规的函数调用,将调用点上内联展开,使用函数代码替代了函数调用。

内联函数定义

只需要在对应的函数里面加入inline

image-20240216181120407
image-20240216181120407

内联函数和宏

有点类似#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;
}
image-20240216181923718
image-20240216181923718

函数重载

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

const和重载

image-20240217160038263
image-20240217160038263

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

image-20240217155738858
image-20240217155738858

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

函数匹配

image-20240217161137951
image-20240217161137951

这里实际调用的是最后一个函数

(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;

贡献者

  • flycodeuflycodeu

公告板

2025-03-04正式迁移知识库到此项目