将不同的参数传递给重载运算符函数
Passing different parameters to an overloaded operator function
我目前有一个名为 Complex 的类:
class Complex{
public:
Complex();
Complex(double, double);
double r, i;
void read(istream &in);
void display(ostream &out) const;
double real, imaginary;
我用来重载加法运算符。目前我有三个单独的函数声明来处理 3 种不同的情况:右侧的 2 个复数、1 个复数和 1 个 int,右侧的 1 个 int 和 1 个复数。
Complex operator+ (const Complex& num1, const Complex& num2);
Complex operator+ (const int num1, const Complex& num2);
Complex operator+ (const Complex& num1,const int num2);
函数声明都只是将复数的"实数"和"虚数"部分相加,并将整数添加到复数的实部。
Complex operator+ (const Complex& num1,const Complex& num2) {
Complex result;
result.real += num1.real + num2.real;
result.imaginary += num1.imaginary +num2.imaginary;
return result;
}
Complex operator+ (const int num1, const Complex& num2){
Complex result;
result.real += num1;
result.imaginary += num2.imaginary;
return result;
}
Complex operator+ (const Complex& num1, const int num2){
Complex result;
result.real += num2;
result.imaginary += num1.imaginary;
return result;
}
一定有更好的方法可以做到这一点吧?还是所有三个案例都必须明确声明?
如果将
委派构造函数添加到Complex
类。
class Complex{
public:
Complex();
Complex(double, double);
Complex(double a) : Complex(a, 0) {}
然后你会发现你只需要定义一个operator+
:
Complex operator+(const Complex &a, const Complex &b);
它将处理示例中的所有用例。
首先,函数中的代码过于复杂。您绝对应该使用其双参数构造函数初始化result
,而不是初始化为零然后修改。例如,代码可以是:
Complex operator+ (const Complex& num1,const Complex& num2)
{
return Complex(num1.real + num2.real, num1.imaginary + num2.imaginary);
}
Complex operator+ (const Complex& num1, const int num2)
{
return Complex(num1.real + num2, num1.imaginary);
}
Complex operator+ (const int num1, const Complex& num2)
{
return num2 + num1; // compiler will inline this
}
我不确定你为什么在这里使用int
,使用double
似乎更好.
Sam 的回答展示了如何将三个函数减少到 1。这减少了您必须执行的键入量,尽管它确实会略微降低性能:您最终会对返回值的imaginary
进行额外的+ 0.0
。
如果我们展望乘法,那么这个惩罚会更严重一些,例如代码:
Complex operator*(Complex const &lhs, double rhs)
{
return Complex(lhs.real * rhs, lhs.imaginary * rhs);
}
比 Complex operator*(Complex const &lhs, Complex const &rhs)
中的代码执行的操作少得多。
因此,您必须在代码简单性和性能之间做出选择。
相关文章:
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 重载运算符new[]的行为取决于析构函数
- 为什么将值返回函数传递给重载=运算符对运算符函数有效,而对其他运算符无效
- 在 myVector 类中重载运算符 + 时出错
- 为什么常量词在重载运算符中不与 ostream 对象一起使用<<?
- 如何在 cpp 中重载运算符 +=?
- C++ 如何重载 [] 运算符并进行函数调用
- 重载运算符的范围是什么?它是否会影响作为类成员的集合的插入函数?
- 为什么我可以在不重载 "=" 运算符的情况下将一个对象分配给另一个对象?
- 重载运算符有地址吗?
- 如何迭代重载运算符 [] 的类?
- 重载运算符与添加问题
- 模板基类中的重载运算符
- 如何调用用于重载运算符"<<"的 friend 函数?
- 在 C++17 中的命名空间和子命名空间中重载运算符是不明确的
- 重载运算符<<采用谷歌 C++ 风格
- C++ 如何正确重载 + 运算符
- cout (<<) 重载运算符不打印减去的矩阵
- 如何在 c++ 中重载运算符 + 以便能够 whrite c_str = "smth" + c_str;
- 重载运算符*以获取对另一个类的实例的引用