默认参数与虚函数

17 Mar 2025 | 4 分钟阅读

如果调用函数未能为参数提供值,编译器将自动分配函数声明中提供的默认参数中指定的值。如果传递了任何值,则默认值将被覆盖。

这里有一个简单的 C++ 示例,展示了如何使用默认参数。因为只有一个函数对第三个和第四个输入使用了默认值,所以我们不需要在这种情况下构造三个求和函数。

示例


Default arguments and virtual function

默认参数的关键点是什么?

  1. 由于默认参数可以在必要时进行调整,它们不同于不能更改的常量参数。
  2. 当调用函数为它们提供值时,默认参数将被替换。当调用函数 sum(10, 15, 25, 30) 时,z 和 w 的值分别被替换为 25 和 30。
  3. 当一个函数被调用时,参数从调用函数到被调用进程的传递方向是从左到右的。因为只使用了 w 的默认值,所以 sum(10, 15, 25) 将分别把值 10、15 和 25 赋给 x、y 和 z。
  4. 一旦在函数声明中为某个参数指定了默认值,那么所有后续的参数都必须使用默认值。默认参数的赋值是从右到左的。也可以这么说。例如,以下函数声明是不正确的,因为默认变量 z 之后的参数不是默认的。
Default arguments and virtual function

默认参数有什么优点?

  1. 在扩展现有函数的功能时,默认参数很有用,因为我们只需向函数添加一个新的默认参数即可。
  2. 它提供了一种简单而高效的编程方法。
  3. 它有助于使程序更小。
  4. 默认参数可以提高程序的一致性。

默认参数有什么缺点?

  1. 编译器必须用其默认值替换函数调用中省略的参数,这会延长执行时间。

什么是虚函数?

虚函数是在基类中定义并由派生类重新定义(重写)的成员函数。当您使用指向基类的指针或引用来引用派生类的对象时,可以调用该对象的虚函数,并执行派生类版本的函数。

  1. 无论使用哪种类型的引用(或指针)来调用函数,虚函数都能确保为对象调用正确的函数。
  2. 它们的主要用途是实现运行时多态性。
  3. 在基类中,函数使用 virtual 关键字声明。
  4. 函数调用在运行时进行解析。

虚函数有哪些规则?

  1. 它们总是在基类中指定,并在派生类中被替换。如果派生类没有重写或重新定义虚函数(这是可选的),则使用基类的函数。
  2. 虚函数在基类和任何派生类中都应具有相同的原型。
  3. 类中不允许有虚构造函数,但允许有虚析构函数。
  4. 为了实现运行时多态性,应通过基类类型的指针或引用来访问虚函数。
  5. 静态操作不能是虚的。
  6. 虚函数可以是另一个类的友元函数。

虚函数可以有默认参数吗?

虚函数与传统函数没有区别,因为它们可能带有默认参数(参见 6.5.1,第 236 页)。当使用默认参数调用函数时,该参数的静态类型定义将用作其值。

换句话说,当通过对基类的引用或指针进行调用时,默认参数将是基类中指定的那些。即使调用了派生版本的函数,仍将使用基类参数。在这种情况下,为基类版本函数指定的默认参数将提供给派生函数。如果派生函数需要向其提供不同的参数,程序将无法按预期运行。


下一个主题C++ 中的私有继承