C++

C++学习笔记-函数默认参数

Posted by zihengCat on 2017-06-19

前言

本文介绍C++中的函数默认参数。

函数默认参数(Default arguments)

在C++中,我们可以在函数原型声明中为形式参数指定一个默认的值。
例如:

void f(int size, int init = 0); /* 函数默认参数 */
int main(void){
    f(10);      /* 给1个参数 */
    f(10, 10);  /* 给2个参数 */
    return 0;
}
void f(int size, int init){
    /* do something */
}

实现机制

C++中函数默认参数的实现机制很简单,就是编译器自动帮你补齐参数…

$ g++ -S df_func.cc
$ less df_func.s

观察汇编代码文件,我们发现:

  • 函数还是那个函数,需要2个参数
  • 调用函数时,缺失的参数由默认参数补齐(编译器完成)
...
void f(int size, int init = 0);   /* 函数默认参数 */
...
    f(10);      /* 实际上是 f(10, 0) */
    f(10, 10); 
...

注意事项

  1. 函数默认参数是写在函数原型声明declaration中的,不能写在函数定义definition之中。(编译器是通过函数原型补上默认参数)
  2. 函数默认参数是编译器在编译时compile-time做的事情,而非运行时run-time机制。
  3. 函数默认参数必须从右往左写,因为编译器是从左往右匹配参数的。
  4. 函数默认参数并不安全,因为可以很容易地修改函数原型。
    void f1(int i = 0, int j, int k);    /* 非法 */
    void f2(int i, int j = 0, int k);    /* 非法 */
    void f3(int i, int j = 0, int k = 0);/* 合法 */
    
    函数默认参数与函数重载结合在一起,可能使代码看上去很混乱…
    谨慎使用函数默认参数吧。

参考资料