C++ Primer 005 : 函数 (重载、缺省、哑元与内联)

1 min read May 22, 2013

C++ Primer 005 : 函数 (重载、缺省、哑元与内联)

Table of Content

本篇主要介绍C++ 中的函数重载、缺省参数、哑元与内联。

函数重载

概念

同一个作用域中,函数的名字相同,函数的参数列表不同,这样的函数构成重载。

方式

  • 函数名相同,函数的参数类型不同

  • 函数名相同,函数的参数个数不同

  • 函数名相同,函数的参数顺序不同

  • const 修饰的常函数和非 const 修饰的函数也可以构成重载

特殊重载关系

  • 使用不同范围的方式导入命名空间时,那么局部优先

  • 当使用相同范围的方式导入命名空间时,那么如果不构成重载,则编译报错产生歧义

函数匹配原则

完全匹配 > 常量转换 > 升级转换 > 标准转换 > 自定义类型转换 > 省略匹配

函数重载原理

  • C++ 编译器通过对函数进行换名,将参数列表信息体现在新的函数名中,从而实现重载

  • C 程序和 C++ 程序的结合: extern "C" 表示告诉编译器,不要对我所修改的函数进行换名,从而满足 C 程序可以直接通过原来的函数名进行调用

缺省参数

首先举个栗子:

void fn(int i = 66){}

fn(118);// i = 118;
fn();// i = 66;

例子中的 int i = 66 就表示了一个缺省参数,如果没有传入该参数,则内部调用将取其默认值。

如果函数中有缺省参数,那么缺省参数必须靠右排列,也就是说如果某个参数有缺省值,那么这个参数右侧的所有参数都必须有缺省值。

再举个栗子:

void fn(int i,char c = 'A',char* p = NULL){} // 正确
void fn(int i,char c = 'A',char* p){} // 错误,最后一个参数也应该有缺省值

如果函数的声明和定义分开,那么参数的缺省值只能写在函数的声明部分。

注意:

  • 在 C 语言中如果没有对函数进行声明,会自动做隐式声明,可能产生警告,但是在 C++ 中会直接编译报错。

  • 当函数具有缺省参数时,要注意避免函数重载时产生歧义。

  • void fn(){} 这样的函数,在 C 语言中表示可以接受任意多个实参,而在 C++ 中表示不接收任何实参。

哑元

概念

只有类型,没有名称的参数叫做哑元。

举个栗子:

void fn(int i){}  // 正常函数
void fn(int) {}   // 哑元函数

调用

虽然哑元函数没有参数名,但调用时不能省略参数的传入。

fn(66);
fn(); // 错误

用途

  • 兼容以前的代码

  • 区分自增自减运算符的重载

内联

使用关键字 inline 修饰的函数叫内联函数。内联函数可以像 C 语言中的宏一样进行替换,但是不是简单的代码替换,而是经过分析之后的指令替换。

注意,inline 关键字只是一种请求,而不是要求,所有最后是否内联由编译器说了算;即使没有使用inline关键字,编译器也可能做内联处理。

Picsew | Ezra