《C++覆辙录》——1.4:未能区分函数重载和形参默认值

简介:

本节书摘来自异步社区出版社《C++覆辙录》一书中的第1章,第1.4节,作者: 【美】Stephen C. Dewhurst(史蒂芬 C. 杜赫斯特),更多章节内容可以访问云栖社区“异步社区”公众号查看。

1.4:未能区分函数重载和形参默认值

函数重载和形参默认值之间其实并无干系。不过,这两个独立的语言特征有时会被混淆,因为它们会模塑出语法上非常相像的函数用法接口。当然,看似一样的接口其背后的抽象意义却大相径庭:

class C1 { 
 public:
  void f1( int arg = 0 );
  // ...
};```

// ...
C1 a;
a.f1(0);
a.f1();`
型别C1的设计者决定给予函数f1()一个形参的默认值。这样一来,C1的使用者就有了两个选择:要么显式地给函数f1()一个实参,要么通过不指定任何实参的方式隐式地给函数f1()一个实参0。所以,上述两个函数调用产生的动作序列12是完全相同的。

class C2 {
 public:
  void f2();
  void f2( int );
  // ...
};```

// ...
C2 a;
a.f2(0);
a.f2();`
型别C2的实现则有很大不同。其使用者的选择是根据给予的实参数目调用两个虽然名字都叫f2(),却是完全不同的函数中的某一个。在我们早先那个C1型别的例子里,两个函数调用产生的动作序列是完全相同的,但在这个例子里它们产生的却是完全不同的动作序列了。这是因为两个函数调用的结果是调用了不同的函数。

通过对成员函数C1::f1()C2:f2()取址,我们就拿到了有关这两种接口之间最本质的不同点的直接证据:

1.jpg gotcha04/c12.cpp

void (C1::*pmf)() = &C1::f1; //错误!   
void (C2::*pmf)() = &C2::f2;```
我们实现C2型别的方法决定了指涉到成员函数的指针`pmf`指涉到了没有带任何形参的那个`f2()`函数。因为`pmf`是个指涉到没有带任何形参的成员函数的指针,编译器能够正确地选择第一个`f2()`作为它应该指涉到的函数。而对于`C1`型别来说,我们将收到编译期错误,因为唯一的名叫`f1()`的成员函数带有一个int型别的形参13。
相关文章
|
17天前
|
程序员 C++
C++中的函数重载有什么作用
【10月更文挑战第19天】C++中的函数重载有什么作用
13 3
|
5月前
|
编译器 C++
C++进阶之路:何为命名空间、缺省参数与函数重载
C++进阶之路:何为命名空间、缺省参数与函数重载
37 3
|
17天前
|
编译器 程序员 C++
C++中的函数重载是什么
【10月更文挑战第19天】C++中的函数重载是什么
15 0
|
1月前
|
自然语言处理 编译器 Linux
【C++】巧用缺省参数与函数重载:提升编程效率的秘密武器
【C++】巧用缺省参数与函数重载:提升编程效率的秘密武器
|
1月前
|
程序员 C++ 开发者
C++入门教程:掌握函数重载、引用与内联函数的概念
通过上述介绍和实例,我们可以看到,函数重载提供了多态性;引用提高了函数调用的效率和便捷性;内联函数则在保证代码清晰的同时,提高了程序的运行效率。掌握这些概念,对于初学者来说是非常重要的,它们是提升C++编程技能的基石。
21 0
|
3月前
|
编译器 程序员 C语言
C++函数重载
在实际开发中,有时候我们需要实现几个功能类似的函数,只是有些细节不同。例如希望交换两个变量的值,这两个变量有多种类型,可以是 int、float、char、bool 等,我们需要通过参数把变量的地址传入函数内部。在C语言中,程序员往往需要分别设计出三个不同名的函数,其函数原型与下面类似: void swap1(int *a, int *b); //交换 int 变量的值 void swap2(float *a, float *b); //交换 float 变量的值 void swap3(char *a, char *b); //交换 char 变量的
C++函数重载
|
3月前
|
编译器 Linux C语言
【C++小知识】为什么C语言不支持函数重载,而C++支持
【C++小知识】为什么C语言不支持函数重载,而C++支持
|
3月前
|
安全 编译器 C++
C++入门 | 函数重载、引用、内联函数
C++入门 | 函数重载、引用、内联函数
31 5
|
4月前
|
存储 自然语言处理 编译器
【C++入门 三】学习C++缺省参数 | 函数重载 | 引用
【C++入门 三】学习C++缺省参数 | 函数重载 | 引用
|
4月前
|
算法 编译器 C++
C++基础知识(三:哑元和内联函数和函数重载)
在C++编程中,"哑元"这个术语虽然不常用,但可以理解为在函数定义或调用中使用的没有实际功能、仅作为占位符的参数。这种做法多见于模板编程或者为了匹配函数签名等场景。例如,在实现某些通用算法时,可能需要一个特定数量的参数来满足编译器要求,即使在特定情况下某些参数并不参与计算,这些参数就可以被视为哑元。