默认参数和虚拟函数
如果调用函数未能为参数提供一个值,编译器将自动分配函数声明中提供的默认参数中指定的值。如果有任何值被传递,默认值将被覆盖。
这里有一个简单明了的C++例子来说明如何使用默认参数。因为只有一个函数使用了第三和第四个输入的默认值,所以在这个例子中我们不需要构造三个和函数。
例子
#include
using namespace std;
int sum(int x, int y, int z = 0, int w = 0)
{
return (x + y + z + w);
}
int main()
{
cout << sum(10, 15) << endl;
cout << sum(10, 15, 25) << endl;
cout << sum(10, 15, 25, 30) << endl;
return 0;
}
默认论证的关键点是什么?
- 由于默认参数可以在必要时进行调整,它们与常量参数不同,常量参数不能被改变。
- 当调用者函数为它们提供数值时,默认参数被替换。当函数sum(10, 15, 25, 30)被调用时,z和w的重要性分别被替换为25和30。
- 当一个函数被调用时,参数的移动方向是由左至右从调用函数转移到被调用进程。因为只是利用了w的默认值,sum(10, 15, 25)将分别给x、y和z分配10、15和25的值。
- 一旦在函数声明中为一个参数指定了缺省值,这个缺省值必须应用于所有随后的参数。默认参数的赋值是从右到左。也可以这样说。例如,下面的函数声明是不正确的,因为随后的默认变量z的参数不是默认值。
默认参数的优点是什么?
- 当扩展一个现有函数的功能时,默认参数是有帮助的,因为我们可以通过简单地在函数中添加一个新的默认参数来实现。
- 它提供了一种直接而有效的编程方法。
- 它有助于使程序更小。
- 默认参数增加了程序的一致性。
默认参数的缺点是什么?
- 编译器必须用默认值替代函数调用的省略参数,这就延长了执行时间。
什么是虚拟函数?
虚函数是指在基类中定义并由派生类重新定义(重写)的成员函数。该对象的虚拟函数可以被调用,当你用一个指针或对基类的引用来引用一个派生类的对象时,派生类的函数版本可以被执行。
- 无论使用哪种引用(或指针)来调用一个函数,虚函数都能确保为一个对象调用正确的函数。
- 它们的主要用途是实现运行时多态性。
- 在基类中,函数是用虚拟关键字声明的。
- 运行时对函数调用的解析被进行了。
虚函数的规则是什么?
- 它们总是在基类中被指定,在派生类中被替换。如果派生类没有覆盖或重新定义虚拟函数,就使用基类中的函数,这是可选的。
- 虚拟函数在基类和任何派生类中都应该有相同的原型。
- 类中不允许有虚拟构造函数,但允许有虚拟析构函数。
- 为了完成运行时的多态性,虚拟函数应该通过基类类型指针或引用来访问。
- 静态操作不能是虚拟的。
- 另一个类的朋友函数的一种类型是虚拟函数。
虚拟函数可以有默认参数吗?
虚拟函数与传统函数没有什么不同,因为它们可能采取默认参数(参见 6.5.1, p. 236)。当一个函数被调用时有一个缺省参数,静态类型对该参数的定义被利用作为它的值。
换句话说,当通过对基类的引用或指针进行调用时,默认参数将是基类中规定的参数。即使当函数的派生版本被调用时,基类的参数仍将被利用。在这种情况下,为函数的基类版本指定的默认参数将被提供给派生函数。如果派生函数需要向它提供不同的参数,程序就不会按预期运行。