1, 内联函数
- 代码量小(1 - 5行), 无复杂逻辑(if, while等), 这样的函数适合作为内联函数
- 优点:内联函数在调用时,直接用函数代码替换函数调用,避免频繁出入栈, 提高执行效率, 以空间换时间
- 用法:在函数声明或函数实现时,在函数前加关键字 inline 注意:内联函数的声明和实现必须写在同一个文件中(可以写在头文件中)
- 内联函数必须是和函数体声明在一起,才有效。 使用 inline 关键字只是建议编译器把这个函数当作内联函数处理 但是决定权在编译器, 如果这个函数太复杂, 不适合作为内联函数, 那么编译器还是把它当作普通函数
2, 函数重载
- 在C语言中, 函数名都是唯一的, 若有函数重名, 则无法编译
- 但在c++中, 函数名可以相同, 只要函数的形参列表不同, 这就是两个函数
- 因为编译器在编译器, 把函数的参数也提取出来了
- 例如
- C语言中, 编译时函数被提取为_swap
C++中, 被提取为_swap_int_int
所以只要形参列表不同, 这就是两个函数
3, 函数的默认参数
- 在C++中, 函数可以有默认参数
- 例如: int add(int a = 10; int b = 20; int c = 30) {return a+b+c};
- 注意: 默认参数只能在函数定义处添加
- 默认参数的添加必须从右往左
因为添加默认参数的目的是为了减少传参
而函数参数是从左往右匹配的
例如:int add(int a = 10; int b = 20; int c) {return a+b+c};
此时如果add(1, 2);
那么第三个参数c就没有值, 肯定就会报错
如果add(1, 2, 3);
那么设置默认参数就没有意义了,因为还是必须传3个参数
注意: 在重载函数中使用默认参数要特别注意
4,函数传参的总结
- 基本类型(int char double)和枚举类型一般用值传递
- 结构体, 类的对象一般用指针或引用传递
- 数组类型一般用指针传递
- 小技巧: 当函数参数超过7个以上, 比较多的时候, 可以把它封装在一个结构体中
然后传指针或引用
测试代码
#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
#include "inline.h"
using namespace std;
//1,内联函数
//代码量小(1 - 5行), 无复杂逻辑(if, while等), 这样的函数适合作为内联函数
//优点:内联函数在调用时,直接用函数代码替换函数调用,避免频繁出入栈, 提高执行效率, 以空间换时间
//用法:在函数声明或函数实现时,在函数前加关键字 inline
//注意:内联函数的声明和实现必须写在同一个文件中(可以写在头文件中)
//内联函数必须是和函数体声明在一起,才有效。
//使用 inline 关键字只是建议编译器把这个函数当作内联函数处理
//但是决定权在编译器, 如果这个函数太复杂, 不适合作为内联函数, 那么编译器还是把它当作普通函数
inline void getInfo();
inline void getInfo()
{
cout << "我可能是一个内联函数" << endl;
cout << "hello, world" << endl;
}
//2,函数重载
//在C语言中, 函数名都是唯一的, 若有函数重名, 则无法编译
//但在c++中, 函数名可以相同, 只要函数的形参列表不同, 这就是两个函数
//因为编译器在编译器, 把函数的参数也提取出来了
//例如: C语言中 编译时函数被提取为_swap
// C++中, 被提取为_swap_int_int
//所以只要形参列表不同, 这就是两个函数
//void swap(int* x, int* y)
//{
// cout << "传址调用" << endl;
// int tmp = *x;
// *x = *y;
// *y = tmp;
//}
//void swap(int& x, int& y)
//{
// cout << "传引用调用" << endl;
// int tmp = x;
// x = y;
// y = tmp;
//}
//3,函数的默认参数
//在C++中, 函数可以有默认参数
//例如: int add(int a = 10; int b = 20; int c = 30) {return a+b+c};
//注意: 默认参数只能在函数定义处添加
// 默认参数的添加必须从右往左
//因为添加默认参数的目的是为了减少传参
//而函数参数是从左往右匹配的
//例如: int add(int a = 10; int b = 20; int c) {return a+b+c};
// 此时如果 add(1, 2) 那么第三个参数c就没有值, 肯定就会报错
// 如果 add(1, 2, 3) 那么设置默认参数就没有意义了,因为还是必须传3个参数
//注意: 在重载函数中使用默认参数要特别注意
void swap(int* x, int* y)
{
cout << "传址调用" << endl;
int tmp = *x;
*x = *y;
*y = tmp;
}
void swap(int& x, int& y)
{
cout << "传引用调用" << endl;
int tmp = x;
x = y;
y = tmp;
}
//void swap(int& x, int& y, bool judge = false)
//{
// cout << "重载函数设置默认参数要特别注意" << endl;
// if(judge)
// {
// int tmp = x;
// x = y;
// y = tmp;
// }
//}
//4,函数传参的总结
//基本类型(int char double)和枚举类型一般用值传递
//结构体, 类的对象一般用指针或引用传递
//数组类型一般用指针传递
//小技巧: 当函数参数超过7个以上, 比较多的时候, 可以把它封装在一个结构体
// 然后传指针或引用
int main()
{
//getInfo();
int a = 100;
int b = 200;
cout << "a = " << a << " b = " << b << endl;
swap(&a, &b);
cout << "a = " << a << " b = " << b << endl;
swap(a, b); //此时调用会出错. 因为有一个swap函数有了默认参数, 所以就不知道是要调用哪一个了
cout << "a = " << a << " b = " << b << endl;
system("pause");
return 0;
}