標籤:
返回:賀老師課程教學連結
談及運算,我們總是習慣“數”的運算。而實際上,像時間之類的對象也是可以進行加減運算的。再進一步,我們的思維還可以拓展,運算加以加到任何事物上,只要我們可以為這些“運算”設計好意義。
例如:有班級類和學生類。兩個學生相加,組成了一個由兩個學生構成的班級;班級加學生,代表班級增加了一名新同學;學生乘學生,結果為這兩個學生“結對子”,可以做某些事(這個對子,需要定義成一個新的類);班級乘班級,是班級中的所有學生,兩兩結對子的所以可能組合。
實際上,班級和學生,已經初步具備了資料庫中用“學生表”儲存學生資訊的特徵。一張“學生表”代表一個班級,而這張表中的每一條“記錄”,則是具體的學生對象。
利用資料庫技術可以建立這張表格,可以用操縱資料庫的語言(SQL語言),完成對資料的相關處理。
這些處理,建立在資料庫理論基礎上。對於關係型資料庫(前述“學生表”,按術語講,就是一個“關係”),其基礎是“關係代數”。關係代數,實際上就是定義了一組運算。無論這些運算用什麼樣的符號,可以與C++中重載後的運算子建立起聯絡來,讓我們一起體會一下,若用C++去實現資料庫最底層的運算,將可以採取什麼樣的策略。
更深一層,代數系統就是由一個非空集合和一組運算構成的系統。這是任何計算模型(計算模型可以是通用的模型,更多我們強調的就是解決具體問題的計算模式),在本質上的描述。關係代數,只不過也就是代數系統中的一個例子罷了。
所以,有機會“科班”學習電腦的同學,隨著課程的進展,藉助離散數學(代數系統是這門課程中的一部分)、可計算性理論等,體會從最一般的、抽象的層面看待計算,這是形成專業思維的重要部分。
當然,在學習C++的時候,體會到“萬物皆對象,各種操作皆運算”,擺脫運算一定是施加於“數”上的觀念,可以有助於將未來要學習的抽象理論具體起來。大學的學習,達到理論聯絡實際很有必要。為此,本文的目標,就是讓菜鳥在接觸專業理論之前,至少隔著門縫看了一眼。
下面的代碼來點乾貨,學生加學生的運算,可以這樣實現:
#include <iostream>using namespace std;class Student;class Class //班級類{ int number; Student *students; friend class Student;public: Class(); Class(const Class &c); void display();};class Student //學僧類{private: int num; string name; char sex; int age; friend class Class;public: Student(){} Student(int n, string nam, char s, int a); Class operator+(Student &s1);};Class::Class():number(0),students(NULL) {}Class::Class(const Class &c){ number=c.number; students=new Student[number]; int i; for(i=0;i<number;i++) students[i]=c.students[i];}void Class::display(){ int i; for(i=0; i<number; i++) { cout<<i<<": "<<students[i].num<<", "<<students[i].name; cout<<", "<<students[i].sex<<", "<<students[i].age<<endl; }}Student::Student(int n, string nam, char s, int a):num(n), name(nam), sex(s),age(a) {}Class Student::operator+(Student &s1){ Class c; c.number=2; c.students=new Student[c.number]; c.students[0]=*this; c.students[1]=s1; return c;}int main(){ Student s1(1, "Zhang", ‘f‘, 20), s2(2, "Li", ‘m‘, 18); Class c = s1+s2; c.display(); return 0;}
進一步的拓展(請感興趣的讀者作為實踐題目):
定義了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運算?
《C++語言基礎》參考——學生可以相加嗎?