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;
}

 

 

呵呵,通過三個例子你明白了嗎?

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章