gpt4 book ai didi

c++ - 在 C++ 中使用友元函数进行 I/O 运算符重载

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:36:23 26 4
gpt4 key购买 nike

我正在自学 C++。我正在研究运算符重载,我能够理解加法和减法运算符重载。但是 I/O 运算符的重载有点令人困惑。我已经为复数创建了一个类,现在我正在重载运算符。

Complex.h 的函数原型(prototype)

friend ostream& operator<<(ostream&, const Complex&);

Complex.cpp 中的函数

ostream& operator<<(ostream& os, const Complex& value){
os << "(" << value.r <<", "
<< value.i << ")" ;
return os;
}
  1. 谁能(在基本层面上)解释为什么我们必须在这里使用友元函数声明?
  2. 为什么我们必须通过引用传递所有参数和运算符的返回类型?
  3. 这个函数在不使用 const 的情况下工作正常,但为什么我们在这里使用 const?将 Complex 作为常量引用传递有什么好处?

最佳答案

不必与流媒体运营商成为 friend 。它确实必须在外部声明,因为 Complex 对象位于运算符的右侧。

但是,如果您的 Complex 类有办法访问所需的成员(可能通过 getter),您可以让流运算符(operator)使用它们。说:

std::ostream& operator<<( std::ostream& os, Complex const& cpx )
{
return os << cpx.getReal() << ',' << cpx.getImaginary();
}

您的 operator/ 重载可以作为内部函数来完成,但实际上最好也作为带有两个 const& 参数的外部函数来实现。如果它是成员函数,则它需要是常量成员。你的不是。

你可以根据 operator/= 来实现它

Complex operator/ ( Complex const& lhs, Complex const& rhs )
{
Complex res( lhs );
res /= rhs; // or just put return in front of this line
return res;
}

关于c++ - 在 C++ 中使用友元函数进行 I/O 运算符重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24723297/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com