C++中的友元函数、静态函数及相关操作详解
立即解锁
发布时间: 2025-08-19 01:36:33 阅读量: 1 订阅数: 6 


C++面向对象编程入门与实践
### C++ 中的友元函数、静态函数及相关操作详解
#### 1. 重载 + 运算符与友元函数的引入
在 C++ 编程中,我们常常会遇到需要对自定义类型进行运算符重载的情况。例如,对于一个表示英制距离的 `Distance` 类,我们希望能够使用 `+` 运算符来实现两个 `Distance` 对象的相加。
下面是一个简单的 `Distance` 类的实现,其中重载了 `+` 运算符:
```cpp
#include <iostream>
using namespace std;
class Distance {
private:
int feet;
float inches;
public:
Distance() : feet(0), inches(0.0) {}
Distance(float fltfeet) {
feet = static_cast<int>(fltfeet);
inches = 12 * (fltfeet - feet);
}
Distance(int ft, float in) : feet(ft), inches(in) {}
void showdist() {
cout << feet << "\'-" << inches << '\"';
}
Distance operator + (Distance);
};
Distance Distance::operator + (Distance d2) {
int f = feet + d2.feet;
float i = inches + d2.inches;
if (i >= 12.0) {
i -= 12.0;
f++;
}
return Distance(f, i);
}
int main() {
Distance d1 = 2.5;
Distance d2 = 1.25;
Distance d3;
cout << "\nd1 = ";
d1.showdist();
cout << "\nd2 = ";
d2.showdist();
d3 = d1 + 10.0;
cout << "\nd3 = ";
d3.showdist();
// d3 = 10.0 + d1; // 这行代码会报错
cout << endl;
return 0;
}
```
在这个例子中,我们定义了一个 `Distance` 类,并重载了 `+` 运算符。当我们执行 `d3 = d1 + 10.0;` 时,编译器会使用单参数构造函数将 `10.0` 转换为 `Distance` 对象,然后进行相加操作。
然而,当我们尝试执行 `d3 = 10.0 + d1;` 时,会出现错误。这是因为重载的 `+` 运算符作为成员函数时,其所属的对象必须位于运算符的左侧。当左侧是不同类型的变量或常量时,编译器会使用该类型的 `+` 运算符,而不是我们重载的 `+` 运算符。
为了解决这个问题,我们可以将 `+` 运算符重载为友元函数:
```cpp
#include <iostream>
using namespace std;
class Distance {
private:
int feet;
float inches;
public:
Distance() { feet = 0; inches = 0.0; }
Distance(float fltfeet) {
feet = int(fltfeet);
inches = 12 * (fltfeet - feet);
}
Distance(int ft, float in) { feet = ft; inches = in; }
void showdist() {
cout << feet << "\'-" << inches << '\"';
}
friend Distance operator + (Distance, Distance);
};
Distance operator + (Distance d1, Distance d2) {
int f = d1.feet + d2.feet;
float i = d1.inches + d2.inches;
if (i >= 12.0) {
i -= 12.0;
f++;
}
return Distance(f, i);
}
int main() {
Distance d1 = 2.5;
Distance d2 = 1.25;
Distance d3;
cout << "\nd1 = ";
d1.showdist();
cout << "\nd2 = ";
d2.showdist();
d3 = d1 + 10.0;
cout << "\nd3 = ";
d3.showdist();
d3 = 10.0 + d1;
cout << "\nd3 = ";
d3.showdist();
cout << endl;
return 0;
}
```
将 `+` 运算符重载为友元函数后,我们可以使用 `d3 = 10.0 + d1;` 这样的语句,因为友元函数可以接受两个 `Distance` 对象作为参数。
下面是一个简单的流程图,展示了 `+` 运算符重载的处理流程:
```mermaid
graph TD;
A[开始] --> B[输入两个 Distance 对象或一个 Distance 对象和一个 float 值];
B --> C{是否为友元函数};
C -- 是 --> D[将两个参数作为 Distance 对象进行相加
```
0
0
复制全文
相关推荐










