C++-C++函数内定义静态成员
请看下面一段C++代码:
#include <iostream>
using namespace std;
//自定义一个类
class RationalNumber
{
public:
RationalNumber(int numerator = 0,int denominator = 1)
:n(numerator),d(denominator)
{
}
private:
int n,d;
friend RationalNumber& operator*(const RationalNumber& lhs,
const RationalNumber& rhs);
friend bool operator==(const RationalNumber& lhs,
const RationalNumber& rhs);
};
//定义*操作符
RationalNumber& operator*(const RationalNumber& lhs,
const RationalNumber& rhs)
{
static RationalNumber result;;
result = RationalNumber(lhs.n * rhs.n,lhs.d * rhs.d);
return result;
}
//定义==操作符
bool operator==(const RationalNumber& lhs,
const RationalNumber& rhs)
{
if (lhs.n == rhs.n && lhs.d == rhs.d)
{
return true;
}
else
return false;
}
int main()
{
RationalNumber a(1,1),b(2,3),c(4,5);
if (a * b == a * c)
{
cout << "Equal" << endl;
}
else
cout << "Not equal" << endl;
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
参考《Effective C++》条款23: 必须返回一个对象时不要试图返回一个引用.
添加打印测试:
RationalNumber& operator*(const RationalNumber& lhs,
const RationalNumber& rhs)
{
static RationalNumber result;;
result = RationalNumber(lhs.n * rhs.n,lhs.d * rhs.d);
printf("%d,%dn", result.n, result.d);
return result;
}
//定义==操作符
bool operator==(const RationalNumber& lhs,
const RationalNumber& rhs)
{
printf("%d,%d / %d,%dn", lhs.n, lhs.d, rhs.n, rhs.d);
if (lhs.n == rhs.n && lhs.d == rhs.d)
{
return true;
}
else
return false;
}
输出结果为:
4,5
2,3
2,3 / 2,3
Equal
可知在if判断中,先计算右边的(a * c),将结果返回给一个静态变量(临时的)。然后计算左边的(a * b),返回的结果又写到之前的临时静态变量。最后将两个结果比较(其实是对个值进行比较),结果相等。
以上纯属猜测,需要资料考证。
operator*必须返回对象(或者对象右值),返回引用会有各种各样的问题。
a*b 返回对 static RationalNumber result 的引用
a*c 返回的 也是对 static RationalNumber result 引用。
该实例与自身相比,因此相等。