過載《操作符

2022-03-22 06:06:03 字數 1949 閱讀 4444

回頭看我們之前的 rational.cpp,你滿意了嗎?反正我是覺得那些**的可讀性仍然欠佳:main 函式裡邊要多次呼叫 print 方法才能實現分數列印,醬紫不行!

如何通過過載 << 操作符來實現 print 列印分數的功能。( 《官方叫插入器 )

你或許知道,或許不知道,從第一次輸出值開始,<< 操作符就一直被過載!

例如:std::cout << 「hello fishc!」;

c 標準庫對左移操作符(<<)進行了過載,讓它可以把值傳送到乙個流去(流的概念)。 但是在這個栗子中,iostream 庫對新的 rational 類表示一無所知,所以不能直接用 << 來輸出我們的有理數(分數)。 但是,沒有什麼能夠阻擋我們過載 << 操作符來讓它接受 rational 物件的巨集偉願望!

另外乙個原因也比較重要:因為,過載的含義本身就是可以用相同的名字去實現不同的功能:輸入引數方面有所差異就不會有問題。

當然,我們無法在現有的 ostream 類裡專門新增乙個新的 operator <<()方法。所以我們只能定義乙個正常的函式在外部過載這個操作符,這與過載方法的語法大同小異,唯一的區別是不再有乙個物件可以用來呼叫 << 過載函式,而不得不通過第乙個輸入引數向這個過載方法傳遞物件。注意區別前邊我們對四則運算符的過載。

下面是乙個 operator <<()函式的原型:

std::ostream& operator<<( std::ostream& os, rational f );

好了,介紹就說這麼多,我們對 rational.cpp 進行改造吧:rational2.cpp

#include #include #include class rational

;rational::rational(int num, int denom)

// normalize() 對分數進行簡化操作包括:

// 1. 只允許分子為負數,如果分母為負數則把負數挪到分子部分,如 1/-2 == -1/2

// 2. 利用歐幾里德演算法(輾轉求餘原理)將分數進行簡化:2/10 => 1/5

void rational::normalize()

// 歐幾里德演算法

int a = abs(numerator);

int b = abs(denominator);

// 求出最大公約數

while( b > 0 )

// 分子、分母分別除以最大公約數得到最簡化分數

numerator /= a;

denominator /= a;

}// a c a*d c*b a*d + c*b

// - + - = --- + --- = ---------

// b d b*d b*d = b*d

rational rational::operator+(rational rhs)

// a c a -c

// - - - = - + --

// b d b d

rational rational::operator-(rational rhs)

// a c a*c

// - * - = ---

// b d b*d

rational rational::operator*(rational rhs)

// a c a d

// - / - = - * -

// b d b c

rational rational::operator/(rational rhs)

std::ostream& operator<<(std::ostream& os, rational f);//函式宣告

int main()

std::ostream& operator<<(std::ostream& os, rational f)

操作符過載

ifndef vertex h define vertex h class vertex vertex float px float py float pz vertex operator const vertex p vertex operator const vertex p void oper...

操作符過載

1.操作符是靜態方法,返回值表示操作結果,引數是運算元。2.操作符過載需要在過載的操作符前加上operator關鍵字。3.最好少用操作符過載,只有在意義明晰而且與內建類的操作一致時才適合使用,以免造成混亂。以建立的分數類 fraction 中的 為例,該分數類中有兩個int型的私有屬性 分子 num...

過載操作符

1.過載操作符1.1 限制過載操作符具有以下限制 1 只有c 預定義的操作符集中的操作符才可以被過載 2 對於內建型別的操作符,它的預定義不能被改變,應不能為內建型別過載操作符,如,不能改變int型的操作符 的含義 3 也不能為內建的資料型別定義其它的操作符 4 只能過載類型別或列舉型別的操作符 5...