Effective c++ Item19代码练习

 先看如下代码:

例1:

#include <iostream>

using namespace std;

class rational {
public:
 explicit rational(int numerator = 0, int denominator = 1);
 int numerator() const;
 int denominator() const;
 const rational operator*(const rational& rhs) const;
 
private:
 int n,d;
};
rational::rational(int numerator, int denominator):n(numerator),d(denominator)
{
 
}
int rational::numerator()const
{
 return n;
}
int rational::denominator()const
{
 return d;
}
const rational rational::operator*(const rational& rhs) const
{
 return rational(this->numerator()*rhs.numerator(),this->denominator()*rhs.denominator());
}
int main()
{
 rational oneeighth(1, 8);
 rational result;
 result = oneeighth * 2;
 result = 2 * oneeighth;
 
 return 0;
}

以上代码在红色粗显的那两行报错:

error C2679: binary '*' : no operator defined which takes a right-hand operand of type 'const int' (or there is no acceptable conversion)”

 

报错原因:第一行是因为rational 的构造函数是explicit,此时不允许将整数2隐式转换成rational类,所以报错,第二行报错原因:

对象oneeighth 是一个包含operator*函数的类的实例,所以编译器调用了那个函数。而整数2没有相应的类,所以没有operator*成员函数,故报错。

 

将以上代码修改为如下:

例2:

#include <iostream>

using namespace std;

class rational {
public:
 rational(int numerator = 0, int denominator = 1);
 int numerator() const;
 int denominator() const;
 const rational operator*(const rational& rhs) const;
 
private:
 int n,d;
};
rational::rational(int numerator, int denominator):n(numerator),d(denominator)
{
 
}
int rational::numerator()const
{
 return n;
}
int rational::denominator()const
{
 return d;
}
const rational rational::operator*(const rational& rhs) const
{
 return rational(this->numerator()*rhs.numerator(),this->denominator()*rhs.denominator());
}
int main()
{
 rational oneeighth(1, 8);
 rational result;
 result = oneeighth * 2;
 result = 2 * oneeighth;
 
 return 0;
}


此时只有一行报错,那如何修改这个错误呢?

例3:

#include <iostream>

using namespace std;

class rational {
public:
 rational(int numerator = 0, int denominator = 1);
 int numerator() const;
 int denominator() const;
private:
 int n,d;
};
rational::rational(int numerator, int denominator):n(numerator),d(denominator)
{

}
int rational::numerator()const
{
 return n;
}
int rational::denominator()const
{
 return d;
}

const rational operator*(const rational& lhs,const rational& rhs)
{
 return rational(lhs.numerator() * rhs.numerator(),
  lhs.denominator() * rhs.denominator());
}
int main()
{
 rational oneeighth(1, 8);
 rational result;
 result = oneeighth * 2;
 result = 2 * oneeighth;
 
 return 0;
}

 

 

呵呵,通过三个例子你明白了吗?

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值