1. 程式人生 > >類設計與宣告之實現有理數類

類設計與宣告之實現有理數類

分清類的成員函式、非成員函式和友元函式

  • 成員函式:定義在類內部的函式,支援過載。
  • 非成員函式:定義在類外部,可以被呼叫但不可以訪問物件私有變數的函式,不支援過載。
  • 友元函式:定義在類外部,可以被呼叫但可以訪問物件私有變數的函式,不支援過載。
  • 使用規則如下:只有非成員函式對最左邊的引數進行型別轉換。如果需要對最左邊的引數進行型別轉換例如2 * oneHalf;,讓其成為非成員函式。如果還需要訪問物件的非公有成員,讓其成為類的友元函式。其它情況下都宣告為成員函式。如果以上情況都不是,讓其成為類的成員函式。
const Rational operator*(const Rational& rhs) const
;//定義為成員函式 result = oneHalf * 2; //正確,相當於呼叫物件的成員函式oneHalf.operator*(2),條件滿足下2隱式轉換為Rational。 result = 2 * oneHalf; //錯誤,2不是物件,所以不能呼叫物件的成員函式,編譯報錯。 //如果const Rational operator*(const Rational& rhs) const;是非成員函式 //那麼編譯器會根據過載情況,呼叫對應的非成員函式,並且如果需要訪問類的私有變數,此函式必須宣告為友元函式。

設計Rational類

1、算術運算,包括加減乘除
必須支援Rational物件之間的算術運算,也支援Rational物件和數字之間的算術運算,也就是下面的類必須很好的支援。

Rational oneEighth(1, 8);
Rational Rational oneHalf(1, 2);
Rational result;
result = oneEighth + oneHalf;//支援
result = 2 + result;//支援
result = result + 2;//支援 

根據上面函式類別的分析。必須將算術運算函式過載為友元非成員函式才可以。友元是因為需要訪問物件私有變數,外部函式可以保證編譯自動呼叫,並強制轉換對應的引數。
2、支援cout和cin
如果operator>>和operator<<過載為成員函式,那麼呼叫將是result >> cin和result << cout

,看著很彆扭,所以必須定義為外部函式,讓編譯器根據符號左右兩邊引數選擇對應的函式執行。
3、求解最大公約數
利用輾轉相除法也叫歐幾里得演算法,是一種非常古老的求解兩個數的最大公約數的演算法。其基於的原理:兩個正整數a和b(a > b),它們的最大公約數gcd等於a除以b的餘數r和b之間的最大公約數。比如,10和25的最大公約數5等於25除以10的餘數5和10的最大公約數;再比如51和21的最大公約數3等於51除以21的餘數9和21的最大公約數,而9和21的最大公約數為3。輾轉相除法的演算法流程可以如下:
步驟1:計算a與b的餘數r。
步驟2:如果r為0,則返回gcd = b。否則,轉到步驟3。
步驟3:使用b的值更新a的值,使用餘數r更新b的值,轉到步驟1。
3、實現類

相關推薦

設計宣告實現有理數

分清類的成員函式、非成員函式和友元函式 成員函式:定義在類內部的函式,支援過載。 非成員函式:定義在類外部,可以被呼叫但不可以訪問物件私有變數的函式,不支援過載。 友元函式:定義在類外部,可以被

8.1 線段設計實現-組合

要求在Point類基礎上採用類組合的思想,設計一個線段類,如圖所示,線段類包括2個點類物件,成員函式能顯示該線段的起點座標、終點座標以及線段的長度。2個點座標從鍵盤輸入,線段長度通過公式計算。 在學習過封裝後,我們要學會將類進行組合,如何進行組合呢? 首先我們將類區分為兩種,一種是被引用的,

匿名Select方法實現自定義對象插入局部表結構中

aso 直接 菜單 ember new order ber 構建 als 在提取局部表結構數據時,通過Select選取需要的字段,如下句,此時其實產生了一個不用於_menuMan的原新數據類型new { c.SYS_COMMANDS_ID,c.TXT_COMMANDTITL

JAVA面向物件程式設計購物車介面的設計功能的實現

1、小組成員及分工 小組成員 負責工作 蘭澤祥 負責總體介面、Git程式碼庫 吳修恩 負責MVC模式、類名包名的規範化 2、Git 倉庫地址 倉庫地址:https://gitee

一個簡單的C++實現有理數的例子

這次本來是老師佈置的一個作業,老師提前把main.cpp給了我們,要求我們在標頭檔案中定義並且實現一個有理數類,使得執行程式後輸出的結果跟他給的一樣。 main.cpp如下: #include <stdio.h> #include "Rational.h" int main() { Ra

python超程式設計實現定製--使用描述符,__slots__,__new__篇

問題:實現一個類,要求行為如同namedtuple:只存在給定名稱的屬性,不允許動態新增例項屬性。 主要知識點在於: __slots__、描述符及property、__new__的使用 程式碼如下: 1 """ 2 執行環境 3 python 3.7+ 4 """ 5 from coll

C++模板的宣告實現不能分離

也許你具有良好的程式設計習慣,在定義一個類的時候總會把宣告和實現分離開,位於不同的檔案中。比如你定義一個類A,首先建立一個.h檔案,程式碼如下: class A { public:     A(int b);     void show();  

C++實現有理數加減乘除

C++上機題,題目如下: 設計一個有理數類,要求如下: 有理數有整數型別的分子、分母組成,通過運算子過載,完成有理數的加、減、乘、除運算,運算結果要求為最簡分數,即分子分母沒有公約數。在主程式中測試類與方法。 不多廢話,完整程式碼我已經貼出來了,註釋也很詳

執行緒的隨機性實現Thread

1、我們先來看下面程式的執行結果 public class Thread2 { public static void main(String[] args) { myThread m=new myThread(); m.start(); System.out.println(

你所不知道的事兒--C++模板的宣告實現不能分離

也許你具有良好的程式設計習慣,在定義一個類的時候總會把宣告和實現分離開,位於不同的檔案中。比如你定義一個類A,首先建立一個.h檔案,程式碼如下: class A { public: A(int b); void show(); ~A

設計、定義並實現Complex

cout spa screen 默認值 ble namespace gin scree mil 實驗結論 Complex類 Code: #include<iostream> #include<cmath> #include&l

課堂小練習: 設計、定義並實現Complex

ostream style std gin img pri 課堂 .sh complex類 #include<iostream> #include<cmath> using namespace std; class Complex

數據庫中字段的數據JAVA中數據型的對應關系

enter mes bigint mat datetime all double float style 類型名稱 顯示長度 數據庫類型 JAVA類型 JDBC類型索引(int) 描述 VARCHAR L+N VARCHAR java.

Java常用(五)集合工具Collections

可變集合 並發 nts oid element 出現的次數 ole 最小 概述 前言    Java提供了一個操作Set、List和Map等集合的工具類:Collections,該工具類提供了大量方法對集合進行排序、查詢和修改等操作,     還提供了將集合對象置為不可

算法設計優化等價轉換

算法優化 等價轉換 Gergovia酒的交易 等價轉換與其說是一種算法的設計方法,更不說是一種算法思想。這種思想能有助於我們把復雜的問題簡單化,幫我們理清問題的思路,甚至能直接得出求解問題的方法。下面通過一道具體的題目來像讀者介紹這種思想。Gergovia酒的交易(Wine trading in

深入淺出分散式儲存的設計優化

隨著資訊化程度的不斷提高,全球資料日益膨脹。面對當前PB級的海量資料儲存需求,傳統的儲存系統在容量和效能的擴充套件上存在瓶頸。雲端儲存以其擴充套件性強、價效比高、容錯性好等優勢得到了業界的廣泛認同。由於其前瞻性,眾多企業都將其作為進軍雲端計算的第一步。分散式檔案系統和分散式塊儲存作為雲端儲存中重要的

effective C++筆記——設計宣告

文章目錄 讓介面容易被正確使用,不易被誤用 設計class猶如設計type 寧以pass-by-reference-to-const替換pass-by-value 必須返回物件是,別妄想返回其reference 將成員變數宣告為private

計算機演算法設計分析遞迴分治策略——二分搜尋技術

遞迴與分治策略 二分搜尋技術   我們所熟知的二分搜尋演算法是運用分治策略的典型例子,針對這個演算法,先給出一個簡單的案例。   目的:給定已排好序的n個元素a[0:n-1],現要在這n個元素中找出一特定的元素x。   我們首先想到的最簡單的是用順序搜尋方法,逐個比較a[0:n-1]中元素,直至找出元

【Effective C++】設計宣告

文章目錄 一、讓介面容易被正確使用,不易被誤用 1、引入新型別預防“介面被誤用” 2、限制類型內什麼事可做,什麼事不可做 3、請記住 二、設計class猶如設計type 1、設計

演算法設計分析入門篇(1.1演算法概述)——什麼是演算法

 我學習的視訊是網易雲平臺上的由王巨集志老師講的“演算法設計與分析”,這裡記錄學習筆記! 1.計算的定義   2.演算法的定義   3.問題的定義       問題是一種關係,下面這個例子中我們定義出一個我們常見的排序問題,之所以要弄出這種嚴格的定義是因為讓問題更嚴謹