内联函数

本文详细介绍了C++中内联函数的定义、优点、使用场景及注意事项,包括如何在类中定义内联函数,以及如何利用内联函数提高代码效率。同时,解释了如何在头文件中定义内联函数以确保在调用点展开。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在C++中我们经常把一些小的操作也定义成函数,比如:

const string &shorterString(const string &s1,const string &s2)
{
	return s1.size()<s2.size()?s1:s2;
}

这样做的好处是:
1.阅读和理解一个函数调用比阅读和理解一条表达语句要容易的多
2.如果需要修改,那么只用修改函数,而不用在使用语句的地方修改每一次语句。
但是,这样做也有缺点:
调用函数比求解表达式慢很多,因为函数调用时,先要保存寄存器,并在函数返回时恢复寄存器;还要复制实参,程序还要转向另一个新的位置等等。

内联函数就可以避免上述缺点,它是得程序在调用点“内联地”展开:

cout<<shorterString(s1,s2)<<endl;
在编译时展开为:
cout<<(s1.size()<s2.size()?s1:s2)<<endl;

这一点跟宏的作用类似。

怎么定义内联函数呢?很简单,只需要在定义时添加关键字inline即可:

inline const string &shorterString(const string &s1,const string &s2)
{
	return s1.size()<s2.size()?s1:s2;
}

通常,我们把比较小(3~5行)而又反复调用的函数定义成类联函数:在内联函数内不允许用循环语句和开关语句。 如果内联函数有这些语句,则编译将该函数视同普通函数那样产生函数调用代码;大多数编译器也不支持递归函数的内联。对于比较大的函数还是老老实实的调用吧。

注意:内联函数应该放在头文件中,而不像一般的函数,在头文件中声明,而在对应的源文件定义。原因是因为内联函数调用时,对编译器必须是可见的,这样才能在调用点展开。

在类中,我们也经常定义一些内联函数。典型的,为了隐藏数据,类中会定义set函数和get来访问数据,这些函数比较短小,而且使用频繁,所以最好定义为内联函数。

在类中定义内联函数有3种办法:

1.直接在类的函数体中定义(不仅仅是声明)的函数自动处理为内联函数。

2.在声明函数名时使用inline来表明它是一个内联函数

3.在定义函数时使用inline表明它是内联函数。

举一个小例子:

class Student
{

public:
	typedef int score;
	score getMath()
	{
		return math;
	}

	inline score getEnglish();
	score getChinese();

private:
	string name;
	int schoolNumber;
	score math;
	score english;
	score chinese;
};

Student::score Student::getEnglish()
{
	return english;
}

inline Student::score Student::getChinese()
{
	return chinses;
}


这三种方法均可。

程序中还有一小点需要注意,就是我使用了typedef int score;来隐藏了“分数”具体实现的细节。而且把它放在public,是得类的使用者通过作用域操作符::使用这个数据类型。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值