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

來源:互聯網
上載者:User

標籤:

返回:賀老師課程教學連結



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

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

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

  利用資料庫技術可以建立這張表格,可以用操縱資料庫的語言(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++語言基礎》參考——學生可以相加嗎?

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.