"本课程件主要讲解C++中的虚函数访问和相关概念,包括静态聚束与动态聚束,以及函数的重载和具有缺省参数值的函数的使用规则。"
在C++编程中,虚函数是面向对象特性的重要组成部分,它允许我们通过基类指针或引用来调用派生类中的重定义方法,实现多态性。虚函数的访问有两种方式:
1. **用基指针访问**:这是实现动态绑定(多态)的关键。当一个基类指针指向派生类对象,并调用虚函数时,程序将在运行时决定调用哪个函数,也就是调用实际对象所属类中的那个版本。这种方式称为动态聚束。
2. **用对象名访问**:如果直接通过对象名调用虚函数,那么在编译时期就能确定调用哪个函数,这被称为静态聚束。也就是说,编译器会根据对象的实际类型选择对应的函数。
接下来,我们来看看具有缺省参数值的函数。在C++中,我们可以在函数声明时为参数设定默认值,这样在调用函数时如果没有提供相应的实参,编译器会自动使用这些默认值。例如:
```cpp
int fac(int n = 2) {
int t = 1;
for (int i = 1; i <= n; i++) t = t * i;
return t;
}
```
在这个例子中,`fac()`函数的`n`参数有一个默认值2。当调用`fac()`时,如果没有提供参数,它将使用默认值2。在`main()`函数中,我们分别调用了`fac(6)`和`fac()`,得到了不同的结果。
使用具有缺省参数值的函数需要注意以下几点:
1. 缺省参数必须从右向左设置,即参数列表右边的参数可以有缺省值,左边的参数不能依赖右边的缺省值。
2. 函数原型声明时可以不写参数名称,但缺省值仍然有效。
3. 一旦在函数原型中设定了缺省值,后面的函数定义中不能再设定缺省值。
另外,函数的重载是C++中允许相同函数名但不同参数列表的函数存在。重载的关键在于能够通过参数列表来区分不同的函数,例如:
```cpp
int fun(int a, int b) { return a + b; }
int fun(int a) { return a * a; }
```
这里`fun`函数被重载了两次,一次接受两个整数参数,另一次只接受一个。在`main`函数中,我们可以通过不同的参数调用不同的`fun`版本。
然而,仅仅返回类型不同是不足以构成函数重载的。这意味着,即使两个函数的参数列表完全相同,但返回类型不同,这样的两个函数仍然是无法重载的。在C++中,函数的重载必须基于参数列表的差异,而不仅仅是返回类型。