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

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。
时间: 2024-08-31 06:57:51

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

JS函数多个参数默认值指定方法分析_javascript技巧

本文实例讲述了JS函数多个参数默认值指定方法.分享给大家供大家参考,具体如下: 函数有一个参数时,以往这样定义(参数为p1): function mfun(p1){ - } 当需要为p1设定一个默认值时 function mfun(p1){ if(p1===undefined) p1=5; //默认值设为5 - } 当函数需要2个参数时,以前习惯这样写 function mfun(p1,p2){-} 后来发现完全不需要这样写,js函数甚至不需要在括弧内预设参数名,可以用一下方式传入任意多个参数自

深入讨论Python函数的参数的默认值所引发的问题的原因_python

本文将介绍使用mutable对象作为Python函数参数默认值潜在的危害,以及其实现原理和设计目的陷阱重现 我们就用实际的举例来演示我们今天所要讨论的主要内容. 下面一段代码定义了一个名为 generate_new_list_with 的函数.该函数的本意是在每次调用时都新建一个包含有给定 element 值的list.而实际运行结果如下:   Python 2.7.9 (default, Dec 19 2014, 06:05:48) [GCC 4.2.1 Compatible Apple LL

js中function函数设置参数有默认值

在php中我可以这样写  代码如下 复制代码 function abcccc ($a=1,$b=2){   return $a+$b; } 调用可直接  代码如下 复制代码 abccc() abccc(1) abccc(1,1) 但在js中这样写提示提示 变量未定义undefined了,但我觉得在js中的默认值应该是 undefined 在函数内预设数可以用 arguments[i] i就是你参数的位置 第一个为0 所以要设定 flag 的默认值 则可以这么写  代码如下 复制代码 functi

《C++覆辙录》——2.7:“函数还是对象”的多义性

2.7:"函数还是对象"的多义性 对象的默认初始化语句不应该写成一个空的初始化实参列表的形式,因为它会被解释成一个函数声明: String s("Semantics, not Syntax! "); // 显式指定了用以初始化的实参 String t; // 默认的对象初始化语句⑧ String x();⑨// 一个函数声明``` ⑧译者注:对象名后不带括号. ⑨译者注:这里声明了一个不带实参并返回`String`型别的函数,可能违反代码作者本意. 这是一个C++语

《C++覆辙录》——导读

前言 C++覆辙录 本书之渊薮乃是近20年的小小挫折.大错特错.不眠之夜和在键盘的敲击中不觉而过的无数周末.里面收集了普遍的.严重的或有意思的C++常见错误,共计九十有九.其中的大多数,(实在惭愧地说)都是我个人曾经犯过的. 术语"gotcha"1有其云谲波诡的形成历史和汗牛充栋的不同定义.但在本书中,我们将它定义为C++范畴里既普遍存在又能加以防范的编码和设计问题.这些常见错误涵盖了从无关大局的语法困扰,到基础层面上的设计瑕疵,再到源自内心的离经叛道等诸方面. 大约10年前,我开始在

javascript arguments与javascript函数重载

1.所 有的函数都有属于自己的一个arguments对象,它包括了函所要调用的参数.他不是一个数组,如果用typeof arguments,返回的是'object'.虽然我们可以用调用数据的方法来调用arguments.比如length,还有index方法.但是数 组的push和pop对象是不适用的. 2.函数定义时的参数个数和函数调用时的参数个数没有任何关系. 在函数中可以用f.arguments[0]和f.arguments[1]得到调用时传入的第一和第二个参数,arguments不能够创建

php定义一个参数带有默认值的函数实例分析

 这篇文章主要介绍了php定义一个参数带有默认值的函数,实例分析了php参数带有默认值的函数使用技巧,需要的朋友可以参考下     本文实例分析了php定义一个参数带有默认值的函数用法.分享给大家供大家参考.具体分析如下: php的函数参数可以指定默认值,指定默认值后,调用时如果不给该参数赋值,则该参数就使用默认值 ? 1 2 3 4 5 6 7 8 9 10 11 <?php function capitalize( $str, $each=TRUE ) { $str = strtolower

javascript中自定义函数参数添加默认值实现方法

最近在Codewars上面看到一道很好的题目,要求用JS写一个函数defaultArguments,用来给指定的函数的某些参数添加默认值.举例来说就是: // foo函数有一个参数,名为xvar foo_ = defaultArguments(foo, {x:3});// foo_是一个函数,调用它会返回foo函数的结果,同时x具有默认值3 下面是一个具体的例子: function add(a, b) {return a+b;} // 给add函数的参数b添加默认值3 var add_ = de

php定义一个参数带有默认值的函数实例分析_php技巧

本文实例分析了php定义一个参数带有默认值的函数用法.分享给大家供大家参考.具体分析如下: php的函数参数可以指定默认值,指定默认值后,调用时如果不给该参数赋值,则该参数就使用默认值 <?php function capitalize( $str, $each=TRUE ) { $str = strtolower($str); if ($each === TRUE) { $str = ucwords ($str); } else { $str = strtoupper($str); } ech