早期作用是用来代替宏
宏函数的缺陷
#define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std; //缺陷1:没有类型 //#define MyAdd(x,y) x+y //解决方法:加括号 #define MyAdd(x,y) ((x)+(y)) void test101() { int ret = MyAdd(10, 20) * 20; //预期结果600 结果是410 10+20*20 加括号后值为600 cout << "ret=" << ret << endl; } //缺陷2: #define MyCompare(a,b) ((a)<(b))?(a):(b) //返回最小值 void test102() { int a = 10; int b = 20; int ret = MyCompare(a, b); //预期: ((a)<(b))?(a):(b) 返回10 没有问题 int ret = MyCompare(++a, b); //预期:11 ((++a)<(b))?(++a):(b) 结果:12 cout << "ret = " << ret << endl; } //缺陷3:宏函数没有作用域 int main() { test101(); system("Pause"); //阻塞功能 return EXIT_SUCCESS; // 返回正常退出 }
内联函数
保留宏函数的短小可替代,不用在内存开辟栈,省去函数调用的开销的优点,又不会像宏一样出现不可预期的错误
inline int func(int a) {return ++;} //会把函数func(int a)替换成大括号的内容
注意事项
1.类的成员函数 默认会在前面加上inline关键字
2.声明和实现分开写的时候都要加inline关键字
inline void func(); //内联函数声明 inline void func() { }; //如果函数实现的时候没有加inline关键字,那么这个函数依然不算内联函数
优点
空间换时间,省去函数调用的开销时间
限制
1.不能存在任何形式的循环语句
2.不能存在过多的条件判断语句
3.函数体不能过于庞大
4.不能对函数进行取址操作