holyya.com
2025-09-04 16:53:12 Thursday
登录
文章检索 我的文章 写文章
C++运算符重载友元函数的用法和示例
2023-07-05 01:22:30 深夜i     --     --
C++ 运算符重载 友元函数 用法 示例

C++中,运算符重载是一种非常有用的功能,它可以让我们自定义类的运算符行为,使其更符合实际需求。而友元函数则允许我们在类中使用非成员函数,并访问其私有成员。在某些情况下,结合使用运算符重载和友元函数,可以让我们更准确地控制类的行为。下面,我们将介绍C++运算符重载友元函数的用法和示例。

在C++中,运算符可以被重载为类的成员函数或非成员函数。如果将运算符重载为成员函数,则必须使用类的成员来调用该运算符。如果将运算符重载为非成员函数,则可以直接使用运算符来调用该函数。当然,在某些情况下,我们需要使用友元函数来重载运算符。比如,在某些运算符重载场景中,需要访问类的私有成员,此时就可以使用友元函数来实现。

下面是一个示例,我们将使用友元函数和运算符重载来定义一个表示二维向量的类Vector2D,具体实现如下:


class Vector2D {

public:

  Vector2D(double x = 0, double y = 0) : m_x(x), m_y(y) {}

  friend Vector2D operator+(const Vector2D& v1, const Vector2D& v2);

  friend Vector2D operator-(const Vector2D& v1, const Vector2D& v2);

  friend Vector2D operator*(const Vector2D& v, double d);

  friend Vector2D operator*(double d, const Vector2D& v);

private:

  double m_x;

  double m_y;

};

Vector2D operator+(const Vector2D& v1, const Vector2D& v2) {

  return Vector2D(v1.m_x + v2.m_x, v1.m_y + v2.m_y);

}

Vector2D operator-(const Vector2D& v1, const Vector2D& v2) {

  return Vector2D(v1.m_x - v2.m_x, v1.m_y - v2.m_y);

}

Vector2D operator*(const Vector2D& v, double d) {

  return Vector2D(v.m_x * d, v.m_y * d);

}

Vector2D operator*(double d, const Vector2D& v) {

  return v * d;

}

在上述代码中,我们定义了一个二维向量类Vector2D,并用友元函数重载了加、减、乘法运算符。其中,加、减法运算符的重载方式非常类似,都是以两个Vector2D对象为参数,返回一个新的Vector2D对象;乘法运算符的重载方式,以一个Vector2D对象和一个double类型数值为参数,返回一个新的Vector2D对象。

在重载运算符时,我们使用了友元函数,这样才能访问类的私有成员m_x和m_y。同时,我们将友元函数定义在类的外部,表明它不是Vector2D的成员函数。

可以使用以下代码来测试我们定义的Vector2D类及其运算符重载:


int main() {

  Vector2D v1(1, 2);

  Vector2D v2(3, 4);

  Vector2D v3 = v1 + v2;

  Vector2D v4 = v1 - v2;

  Vector2D v5 = v1 * 2.0;

  Vector2D v6 = 2.0 * v2;

  return 0;

}

在main函数中,我们定义了两个Vector2D对象v1和v2,并使用它们来测试加、减、乘法运算符重载的效果。可以看到,与普通的加、减、乘法运算符不同的是,我们使用了Vector2D类的对象来调用这些运算符。

总结来说,运算符重载友元函数可以让我们更好地控制类的行为,在某些情况下可以访问类的私有成员。使用C++的运算符重载和友元函数功能,可以让开发者自定义类的行为,满足更多不同的业务需求。

  
  
下一篇: QML C++模型

评论区

{{item['qq_nickname']}}
()
回复
回复