默认参数
C++允许函数设置默认参数,在调用时可以根据情况省略实参,具体规则如下:
- 默认参数只能按照右到左的顺序
- 如果函数同时有声明、实现,默认参数只能放在函数声明中
- 默认参数的值可以是常量、全局符号(全局变量、函数名)
int age = 10;
void test() {
cout << "test()" << endl;
}
void display (int a, int b = 20, int c = age, void (*function)() = test) {
cout << "a is " << a << endl;
cout << "b is " << b << endl;
cout << "c is " << c << endl;
function();
}
int main(int argc, const char * argv[]) {
display(100, 30);
return 0;
}
注意:函数重载、默认参数可能会产生冲突、二义性(建议优先选择使用默认参数)
void display (int a, int b = 10) {
cout << "a is " << a << endl;
cout << "b is " << b << endl;
}
void display (int a) {
cout << "a is " << a << endl;
}
int main(int argc, const char * argv[]) {
// 此处调用会有二义性
display(10);
return 0;
}
内联函数(inline function)
使用inline
修饰函数的声明或者实现,可以使其变成内联函数
- 建议声明和实现都加上
inline
特点:
- 编译器会将函数调用直接展开为函数体代码
- 可以减少函数调用的开销
- 会增大代码体积(
每一次调用都相当于将函数体代码复制过去
)
注意:
- 内联函数尽量不要超过10行代码
- 有些函数即使声明为内联函数,也不一定被编译器内联,比如递归
inline int sum (int a, int b) {
return sum(a, b);
}
int main(int argc, const char * argv[]) {
sum(10, 10);
return 0;
}
内联函数和宏:
- 内联函数和宏,都可以减少函数的调用开销(
直接调用函数体代码,不需要为函数分配栈空间
) - 对比宏,内联函数多了语法检测和函数特性
语法检测:是指在编译阶段进行语法检查,如下代码:
// 此处并不会报错,而是在调用的时候才会报错,且不会说明错误原因
#define sum(a, b) ((a) + (b))10000
int sum(int a, int b) {
// 此处直接报错
100000
return a + b;
}
函数特性:详见如下代码:
// 此处并不会报错,而是在调用的时候才会报错,且不会说明错误原因
#define sum(a) (a)
int sum(int a) {
return a + a;
}
int main(int argc, const char * argv[]) {
int a = 10;
// 此处如果是调用的宏定义,会转为 (a++) + (a++),对a会加两次
// 如果是函数调用,sum(a++)中的a++会先计算,再进行函数内的传值
int c = sum(a++);
cout << c << endl;
return 0;
}