将不同的参数传递给重载的运算符函数
Passing different parameters to an overloaded operator function
我目前有一个名为 Complex 的 class:
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);
函数声明都只是将复数的"real"和"imaginary"部分相加,并将整数与复数的实部相加。
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。
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 个。这减少了您必须执行的输入量,尽管它确实会略微降低性能:您最终会在 + 0.0
return 值的 imaginary
.
如果我们提前看乘法,那么这个惩罚会更严重一些,例如代码:
Complex operator*(Complex const &lhs, double rhs)
{
return Complex(lhs.real * rhs, lhs.imaginary * rhs);
}
比 Complex operator*(Complex const &lhs, Complex const &rhs)
中的代码少很多操作。
因此您必须在代码简单性和性能之间做出选择。
我目前有一个名为 Complex 的 class:
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);
函数声明都只是将复数的"real"和"imaginary"部分相加,并将整数与复数的实部相加。
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。
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 个。这减少了您必须执行的输入量,尽管它确实会略微降低性能:您最终会在 + 0.0
return 值的 imaginary
.
如果我们提前看乘法,那么这个惩罚会更严重一些,例如代码:
Complex operator*(Complex const &lhs, double rhs)
{
return Complex(lhs.real * rhs, lhs.imaginary * rhs);
}
比 Complex operator*(Complex const &lhs, Complex const &rhs)
中的代码少很多操作。
因此您必须在代码简单性和性能之间做出选择。