天天看點

《C++語言基礎》參考——學生可以相加嗎?

  談及運算,我們總是習慣“數”的運算。而實際上,像時間之類的對象也是可以進行加減運算的。再進一步,我們的思維還可以拓展,運算加以加到任何事物上,隻要我們可以為這些“運算”設計好意義。

  例如:有班級類和學生類。兩個學生相加,組成了一個由兩個學生構成的班級;班級加學生,代表班級增加了一名新同學;學生乘學生,結果為這兩個學生“結對子”,可以做某些事(這個對子,需要定義成一個新的類);班級乘班級,是班級中的所有學生,兩兩結對子的是以可能組合。

  實際上,班級和學生,已經初步具備了資料庫中用“學生表”存儲學生資訊的特征。一張“學生表”代表一個班級,而這張表中的每一條“記錄”,則是具體的學生對象。

  利用資料庫技術可以建立這張表格,可以用操縱資料庫的語言(sql語言),完成對資料的相關處理。

  這些處理,建立在資料庫理論基礎上。對于關系型資料庫(前述“學生表”,按術語講,就是一個“關系”),其基礎是“關系代數”。關系代數,實際上就是定義了一組運算。無論這些運算用什麼樣的符号,可以與c++中重載後的運算符建立起聯系來,讓我們一起體會一下,若用c++去實作資料庫最底層的運算,将可以采取什麼樣的政策。

  更深一層,代數系統就是由一個非空集合和一組運算構成的系統。這是任何計算模型(計算模型可以是通用的模型,更多我們強調的就是解決具體問題的計算模式),在本質上的描述。關系代數,隻不過也就是代數系統中的一個例子罷了。

  是以,有機會“科班”學習計算機的同學,随着課程的進展,借助離散數學(代數系統是這門課程中的一部分)、可計算性理論等,體會從最一般的、抽象的層面看待計算,這是形成專業思維的重要部分。

  當然,在學習c++的時候,體會到“萬物皆對象,各種操作皆運算”,擺脫運算一定是施加于“數”上的觀念,可以有助于将未來要學習的抽象理論具體起來。大學的學習,達到理論聯系實際很有必要。為此,本文的目标,就是讓菜鳥在接觸專業理論之前,至少隔着門縫看了一眼。

  下面的代碼來點幹貨,學生加學生的運算,可以這樣實作:

進一步的拓展(請感興趣的讀者作為實踐題目):

定義了student s1, s2; class c1, c2; 後:

(1)你是否可以定義出支援c1+c2、c1+s1、c1-c2之類的運算?

(2)為s1*s2、s1*c1、c1*c2确定其含義,必要時增加新的類型定義,實作*運算符的重載?

(3)(更遠的未來)參考關系代數中對除法的定義,實作c1/s1、c1/c2運算?