常见错误4:未能区分函数重载和形式参数默认值
函数重载和形式参数默认值之间其实无关系。不过,这两个独立的语言特征有时会被混淆,
因为它们会构建出语法上非常想像的函数语法接口。当然,看似一样的接口,背后的抽象
意义大相径庭。
函数重载主要用于一组抽象意义相同,但实现不同的函数,而形式参数默认值主要出于简化,
为函数提供更间接的接口。函数重载和形式参数默认值是两个毫不相干的语言特征,它们出于不同
函数重载和形式参数默认值之间其实无关系。不过,这两个独立的语言特征有时会被混淆,
因为它们会构建出语法上非常想像的函数语法接口。当然,看似一样的接口,背后的抽象
意义大相径庭。
函数重载主要用于一组抽象意义相同,但实现不同的函数,而形式参数默认值主要出于简化,
为函数提供更间接的接口。函数重载和形式参数默认值是两个毫不相干的语言特征,它们出于不同
的目的而设计,行为也完全不同。
c12.h
#ifndef C12_H
#define C12_H
class C1 {
public:
void f1( int arg = 0 ) {} // 一个形式参数的默认值
//c1的使用者有两个选择,显示地给函数f1()一个实际参数,要么隐式地给函数f1()
//一个世纪参数0,两个函数调用产生的动作序列是相同的。
};
class C2 {
public:
void f2() {}//c2有所不同。使用者的选择根据参数数目调用两个虽然名字
//都叫f2(),却是完全不同的函数中的某一个。这个例子产生完全不同的动作序列
void f2( int ) {}
// ...
};
#endif
c12.cpp
#include "c12.h"
int main() {
C1 c1;
c1.f1(0);
c1.f1();
C2 c2;
c2.f2(0);
c2.f2();
//void (C1::*pmf1)() = &C1::f1; //error!
//唯一名叫f1()的提供成员函数带有一个int类型的形式参数
void (C2::*pmf2)() = &C2::f2;
//c2类型的方法,决定了指向成员函数的指针pmf指向了没有带任何形式参数
//的那个f2()函数。 pmf是个指向没有带任何形式参数的成员函数的指针,编译器能够
//正确地选择第一个f2()作为它应该指向的函数。
return 0;
}