Date
Jul. 14th, 2024
 
2024年 6月 9日

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

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

Published 12:05 May 22, 2013.

Created by @ezra. Categorized in #Programming, and tagged as #C/C++.

Source format: Markdown

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关键字,编译器也可能做内联处理。

Pinned Message
HOTODOGO
I'm looking for a SOFTWARE PROJECT DIRECTOR / SOFTWARE R&D DIRECTOR position in a fresh and dynamic company. I would like to gain the right experience and extend my skills while working in great teams and big projects.
Feel free to contact me.
For more information, please view online résumé or download PDF
本人正在寻求任职 软件项目经理 / 软件技术经理 岗位的机会, 希望加⼊某个新鲜⽽充满活⼒的公司。
如有意向请随时 与我联系
更多信息请 查阅在线简历下载 PDF