必須返回物件時,別妄想返回其reference(static用法陷阱)
阿新 • • 發佈:2019-02-05
根據條款21的說明。實現了static版本的程式碼
class Rational{ public: Rational(){} Rational(int numerator/* = 0*/, int denominator = 5) { numerator1 = numerator; denominator1 = denominator; } public: int numerator1; int denominator1; }; bool operator == (const Rational& lhs, const Rational& rhs) { if (lhs.numerator1*rhs.denominator1 == rhs.numerator1*lhs.denominator1) return true; else return false; } const Rational& operator*(const Rational& lhs, const Rational& rhs) { static Rational result; result.numerator1 = lhs.numerator1*rhs.numerator1; result.denominator1 = lhs.denominator1*rhs.denominator1; return result; } int main(int argc, char *argv[]) { Rational oneEight(1, 8); Rational oneHalf(1, 2); Rational onefour(1, 4); Rational onefive(1, 5); Rational one = oneEight*oneHalf; Rational two = onefour*onefive; if( one == two ) qDebug()<<"true"; else qDebug()<<"false"; if((oneEight*oneHalf)==(onefour*onefive)) qDebug()<<"this is true"; else qDebug()<<"this is false"; }
結果
第二個if判斷語句中。在operator==被呼叫前,已有兩個operat*呼叫式起作用,每一個都返回reference指向operator*內部定義的static Rational物件。因此operator==被要求將“operator*內的static Rational物件值”拿來和“operator*內的static Rational物件值”比較,結果一定是一樣的。(兩次operator*呼叫的確各自改變了static Rational物件值,但由於它們返回的都是 reference,因此呼叫端看到的永遠是static
Rational物件的“現值”。)