C++函数特性深度解析
立即解锁
发布时间: 2025-08-19 01:36:29 阅读量: 1 订阅数: 6 


C++面向对象编程入门与实践
### C++ 函数特性深度解析
#### 1. 引用传递参数
在某些程序里,会初始化两个 `Distance` 变量 `d1` 和 `d2` 并显示它们的值,接着调用 `scale()` 函数,将 `d1` 乘以 0.5,`d2` 乘以 0.25,最后显示计算后的距离值。示例代码如下:
```cpp
scale(d1, 0.5);
scale(d2, 0.25);
```
这里的函数调用直接对 `d1` 和 `d2` 进行修改,函数不返回任何值,而是直接在传入的 `Distance` 参数上执行操作,此参数通过引用传递给 `scale()` 函数。若调用程序中仅改变一个值,也可将函数改写为按值传递参数并返回缩放后的值,像这样:
```cpp
d1 = scale(d1, 0.5);
```
不过这种写法会显得冗余。
引用在 C 语言中并不存在,在 C 里指针有类似的作用,但使用起来往往没那么方便。C++ 引入引用参数,是为了在涉及对象和简单变量的各种场景中提供更多灵活性。除了按值传递和引用传递,传递参数给函数的第三种方式是使用指针。
#### 2. 函数重载
函数重载指的是一个函数会根据传入的数据类型执行不同的操作。下面通过不同方面来详细介绍函数重载。
##### 2.1 不同数量的参数
假设有三个函数 `starline()`、`repchar()` 和 `charline()`,它们功能类似,但参数不同。为了方便使用,可让它们使用相同的名称。以下是 `OVERLOAD` 程序示例:
```cpp
// overload.cpp
// demonstrates function overloading
#include <iostream>
using namespace std;
void repchar(); //declarations
void repchar(char);
void repchar(char, int);
int main()
{
repchar();
repchar('=');
repchar('+', 30);
return 0;
}
//--------------------------------------------------------------
// repchar()
// displays 45 asterisks
void repchar()
{
for(int j=0; j<45; j++) // always loops 45 times
cout << '*'; // always prints asterisk
cout << endl;
}
//--------------------------------------------------------------
// repchar()
// displays 45 copies of specified character
void repchar(char ch)
{
for(int j=0; j<45; j++) // always loops 45 times
cout << ch; // prints specified character
cout << endl;
}
//--------------------------------------------------------------
// repchar()
// displays specified number of copies of specified character
void repchar(char ch, int n)
{
for(int j=0; j<n; j++) // loops n times
cout << ch; // prints specified character
cout << endl;
}
```
这个程序输出三行字符:
```
*********************************************
=============================================
++++++++++++++++++++++++++++++
```
前两行长度为 45 个字符,第三行为 30 个。程序中有三个同名函数,编译器依据函数签名(参数数量和数据类型)来区分它们。具体如下表所示:
| 函数声明 | 参数数量 | 参数类型 |
| ---- | ---- | ---- |
| `void repchar();` | 0 | 无 |
| `void repchar(char);` | 1 | `char` |
| `void repchar(char, int);` | 2 | `char` 和 `int` |
##### 2.2 不同类型的参数
以 `OVERENGL` 程序为例,它使用重载函数 `engldisp()` 来显示英尺和英寸格式的距离。函数的单个参数可以是 `Distance` 类型的结构体,也可以是 `float` 类型的简单变量。示例代码如下:
```cpp
// overengl.cpp
// demonstrates overloaded functions
#include <iostream>
using namespace std;
////////////////////////////////////////////////////////////////
struct Distance //English distance
{
int feet;
float inches;
};
////////////////////////////////////////////////////////////////
void engldisp( Distance ); //declarations
void engldisp( float );
int main()
{
Distance d1; //distance of type Distance
float d2; //distance of type float
//get length d1 from user
cout << "\nEnter feet: "; cin >> d1.feet;
cout << "Enter inches: "; cin >> d1.inches;
//get length d2 from user
cout << "Enter entire distance in inches: "; cin >> d2;
cout << "\nd1 = ";
engldisp(d1); //display length 1
cout << "\nd2 = ";
engldisp(d2); //display length 2
cout << endl;
return 0;
}
//--------------------------------------------------------------
// engldisp()
// display structure of type Distance in feet and inches
void engldisp( Distance dd ) //parameter dd of type Distance
{
cout << dd.feet << "\'-" << dd.inches << "\"";
}
//--------------------------------------------------------------
// engldisp()
// display variable of type float in feet and inches
void engldisp( float dd ) //parameter dd of type float
{
int feet = static_cast<int>(dd / 12);
float inches = dd - feet*12;
cout << feet << "\'-" << inches << "\"";
}
```
用户输入两个距离,程序调用重载函数 `engldisp()` 分别显示不同类型的距离。例如:
```
Enter feet: 5
Enter inches: 10.5
Enter entire distance in inches: 76.5
d1 = 5'-10.5"
d2 = 6'-4.5"
```
不同版本的 `engldisp()` 功能类似,但代码差异较大,接收全英寸输入的版本需要先将其转换为英尺和英寸再显示结果。函数重载能减少需要记忆的函数名
0
0
复制全文
相关推荐










