申明一个求两个点中点的友元函数
时间: 2024-05-11 19:18:45 浏览: 11
假设点类为Point,友元函数为midPoint,函数原型如下:
```c++
class Point {
public:
Point(int x, int y) : m_x(x), m_y(y) {}
friend Point midPoint(const Point& p1, const Point& p2);
private:
int m_x;
int m_y;
};
Point midPoint(const Point& p1, const Point& p2) {
int midX = (p1.m_x + p2.m_x) / 2;
int midY = (p1.m_y + p2.m_y) / 2;
return Point(midX, midY);
}
```
在Point类中声明midPoint函数为友元函数,使其可以访问Point类的私有成员变量。midPoint函数计算p1和p2的中点,返回一个新的Point对象。
相关问题
定义一个友元函数,求任意两点之间的距离。
假设有一个点类 Point,其中包含私有成员变量 x 和 y 分别表示该点的横纵坐标,可以按照如下方式定义友元函数 distance:
```c++
#include <cmath>
class Point {
private:
double x, y;
public:
Point(double x, double y) : x(x), y(y) {}
friend double distance(const Point& a, const Point& b);
};
double distance(const Point& a, const Point& b) {
double dx = a.x - b.x;
double dy = a.y - b.y;
return std::sqrt(dx * dx + dy * dy);
}
```
在这个友元函数中,我们使用了 cmath 库中的 sqrt 函数来计算两点之间的距离。使用该函数,可以这样计算两个点 A 和 B 之间的距离:
```c++
Point a(1.0, 2.0);
Point b(3.0, 4.0);
double d = distance(a, b);
```
其中 d 的值将等于根号下 8。
如何将一个运算符重载为类的友元函数
很高兴回答您的问题。要将一个运算符重载为类的友元函数,可以在类的定义之外定义该函数,并在其中指定类作为参数。例如,如果想要重载"+"运算符为一个类的友元函数,可以这样定义:
```c++
class MyClass {
public:
int a, b;
MyClass operator+(const MyClass& rhs); // 声明运算符重载
friend MyClass operator+(int lhs, const MyClass& rhs); // 定义友元函数
};
MyClass MyClass::operator+(const MyClass& rhs) {
MyClass res;
res.a = a + rhs.a;
res.b = b + rhs.b;
return res;
}
MyClass operator+(int lhs, const MyClass& rhs) {
MyClass res;
res.a = lhs + rhs.a;
res.b = lhs + rhs.b;
return res;
}
```
在这个例子中,"+"运算符被重载为MyClass类的成员函数,"+"运算符也被重载为一个类的友元函数。友元函数定义在类的外部,必须在函数名前加上关键字"friend"以访问类的私有成员。由于友元函数不是MyClass类的成员函数,因此不能使用this指针。重载后的"+"运算符可以像原始的"+"运算符一样使用,也可以使用友元函数的方式来调用。