C++运算符重载混淆
C++ Operator Overload Confusion
所以我创建了这个类,它可以添加两个对象的两个值。我真正不明白的是,在运算符函数中,分子和分母的值是否来自 int main() 中的对象 no1?
class frac
{
public:
frac operator+(frac&);
frac();
frac(int, int);
int numerator;
int denominator;
};
frac frac::operator+(frac& tmp)
{
frac tmpResult;
tmpResult.numerator = numerator + tmp.numerator;
tmpResult.denominator = denominator + tmp.denominator;
return tmpResult;
}
int main()
{
frac no1(2, 5);
frac no2(3, 6);
frac result = no1 + no2;
return 0;
}
分子和分母的值是否来自 int main() 中的对象 no1?
是的。
是的,它被定义为成员函数,所以它等效于调用
no1.operator+(no2);
您希望将参数类型更改为const
引用,因为您实际上并不想修改右侧。你想修复你的数学。
请注意,您也可以使用免费函数
frac operator+(const frac& lhs, const frac& rhs) { ... }
这对某些人(包括我)来说似乎更自然。
是的,你是对的。可以在类方法中访问类成员,而无需指定其来源(就像它们在本地声明一样)。
frac frac::operator+(frac& tmp)
{
frac tmpResult;
tmpResult.numerator = numerator + tmp.numerator;
tmpResult.denominator = denominator + tmp.denominator;
return tmpResult;
}
此代码可以重写如下:
frac frac::operator+(frac& tmp)
{
frac tmpResult;
tmpResult.numerator = this->numerator + tmp.numerator;
tmpResult.denominator = this->denominator + tmp.denominator;
return tmpResult;
}
PS:我相信你的意思是运算符超载。
编辑:我有这种冲动来纠正你的数学,因为你正在处理错误的分数。
分数加法(和减法)可以像这样完成:
frac frac::operator+(frac& tmp)
{
int common_denominator = tmp.denominator * this->denominator;
int common_numerator = tmp.numerator * this->denominator + this->numerator * tmp.denominator;
//You can add simplification by dividing these
//two above with their greatest common divisor
//in order to avoid cases like 111/222 which can
//be represented as 1/2. (this is optional)
return frac(common_numerator, common_denominator)
}
是的。分子和分母的值来自对象编号 1。
为了您的理解,您也可以将其写为:
frac result = no1.operator+( no2 );
您的 main() 可以重写为更明确:
int main()
{
frac no1(2, 5);
frac no2(3, 6);
frac result = no1.operator+( no2 );
return 0;
}
此代码是等效的,但可能更容易理解哪个对象指针作为 this 传递到 operator+
忽略
你的数学错误...
将重载运算符声明为成员函数时,假定第一个参数this
。 也就是说,no1 + no2
只是no1.operator+(no2)
的简写。 因此,该函数从当前no1
对象(因为它位于左侧)看到numerator
和denominator
。
或者,您也可以通过这种方式声明函数:
class frac
{
// class declaration
friend frac operator+(const frac& lhs, const frac& rhs);
};
frac operator+(const frac& lhs, const frac& rhs)
{
// implement fraction addition for lhs + rhs
}
相关文章:
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 重载运算符new[]的行为取决于析构函数
- 为什么将值返回函数传递给重载=运算符对运算符函数有效,而对其他运算符无效
- 在 myVector 类中重载运算符 + 时出错
- 为什么常量词在重载运算符中不与 ostream 对象一起使用<<?
- 如何在 cpp 中重载运算符 +=?
- C++ 如何重载 [] 运算符并进行函数调用
- 重载运算符的范围是什么?它是否会影响作为类成员的集合的插入函数?
- 为什么我可以在不重载 "=" 运算符的情况下将一个对象分配给另一个对象?
- 重载运算符有地址吗?
- 如何迭代重载运算符 [] 的类?
- 重载运算符与添加问题
- 模板基类中的重载运算符
- 如何调用用于重载运算符"<<"的 friend 函数?
- 在 C++17 中的命名空间和子命名空间中重载运算符是不明确的
- 重载运算符<<采用谷歌 C++ 风格
- C++ 如何正确重载 + 运算符
- cout (<<) 重载运算符不打印减去的矩阵
- 如何在 c++ 中重载运算符 + 以便能够 whrite c_str = "smth" + c_str;
- 重载运算符*以获取对另一个类的实例的引用