在編寫程式時,使用3種基本控制結構來構造程式。可以說,程式基本上都含有順序、選擇、迴圈3種基本控制結構,這3種結構到目前為止仍是主要的控制結構。程式以控制結構為單位,只有一個入口和一個出口,基於控制結構可以從前往後地順序閱讀程式,程式的靜態描述與執行時的控制流程容易對應,所以可以獨立地理解各個部分。... ...
一、結構化程式設計與面向對象程式設計
1、結構化程式設計
- 在結構化程式設計中,採用自頂向下、逐步求精及模塊化的思想,將複雜的大問題層層分解為許多簡單的小問題。
- 在編寫程式時,使用3種基本控制結構來構造程式。可以說,程式基本上都含有順序、選擇、迴圈3種基本控制結構,這3種結構到目前為止仍是主要的控制結構。程式以控制結構為單位,只有一個入口和一個出口,基於控制結構可以從前往後地順序閱讀程式,程式的靜態描述與執行時的控制流程容易對應,所以可以獨立地理解各個部分。結構化程式設計主要強調的是程式的易讀性
2、面向對象程式設計的概念和特點
- 所謂面向對象的程式設計方法,就是使分析、設計和實現一個系統的方法儘可能地接近人們認識一個系統的方法。通常包括3個方面:面向對象的分析、面向對象的設計和麵向對象的程式設計。
- 面向對象技術把問題看成是相互作用的事物的集合,也就是對象的集合。對象具有兩個特性:一是狀態;狀態是指對象本身的信息,也稱為屬性;二是行為,行為是對對象的操作。通過對事物的抽象找出同一類對象的共同屬性(靜態特征)和行為(動態特征),從而得到類的概念。對象是類的一個具象,類是對象的一個抽象
3、面向對象的程式設計有“抽象”“封裝”“繼承”和“多態”4個基本特點。
- 抽象:對象是系統中用來描述客觀事物的一個實體,如各位員工是員工類的一個個對象。對象的特點包括兩個方面:屬性和操作。屬性指的是描述對象靜態特征的數據項,如員工的姓名、職位、薪水等,可以用變數來表示;操作指的是描述對象動態特征(即行為)的函數序列,也稱為方法或服務,如員工可以請假、加班,員工還可以獲得提拔、加薪等。C++中使用對象名、屬性和操作三要素來描述對象
- 封裝:在C++中,通過用戶定義的類來支持數據封裝和信息隱藏。
- 繼承:在C++現有類的基礎上可以聲明新的類,將一個已有類中的數據和函數保留,並加上自己特殊的數據和函數,從而構成一個新類,這就是繼承和復用的思想。原來的類是基類,也稱為父類或超類。新類是派生類,也稱為子類。
- 多態:多態是指不同種類的對象都具有名稱相同的行為,而具體行為的實現方式卻有所不同。在一個類或多個類中,可以讓多個方法使用同一個名字,從而具有多態性。這是通過函數重載及運算符重載實現的多態。
二、類的定義
- 字母、數字和下劃線的組合,大小寫敏感,但不能以數字開頭,也不能和系統中使用的關鍵字完全相同。
- 類是具有唯一標識符的實體,就是說類名不能重覆。類定義以“;”結束,大括弧中的部分稱為類體。
- 定義類時系統並不為類分配存儲空間,而只是把類看作是一種模板或樣板。或者說,類可以看作是用戶自定義的一種數據類型。在C++98標準下,類中聲明的任何成員不能使用auto、extern和register關鍵字進行修飾。
- 類中的成員按功能劃分,包括成員變數和成員函數;按訪問許可權劃分,包括公有成員成、私有成員和保護員。
- 在C++中還可以定義不是任何類的成員的函數,這樣的函數可稱為“全局函數”
- 成員函數既可以在類體內定義,也可以在類體外定義。如果成員函數定義在類體內部,則預設是內聯函數。也可以在類體內部聲明函數,並加上inline關鍵字,然後在類體外給出函數定義,這樣的成員函數也是內聯函數。
- 如果成員函數定義在類體外,則類體內必須要有函數原型,類體外函數定義的前面必須用“類名::”來限定,格式如下:
-
返回值類型 類名::成員函數名(參數列表){ 成員函數的函數體 }
- 類名是成員函數所屬類的名字,符號::是類作用域運算符,表明它後面的成員函數是屬於類名標識的這個類的。返回值類型就是這個成員函數返回值的類型。
- 類C中不能定義類C的成員變數,但可以定義類C的指針和引用。
- 成員函數並非每個對象各自存有一份。成員函數和普通函數一樣,在記憶體中只有一份,它可以作用於不同的對象,為類中各對象共用。
- 通常,因為函數體代碼較長,所以在類體內僅給出成員函數的原型,然後在類體外給出對應的函數體。如果函數體定義在類體內,則系統將其視為內聯函數。類中定義的成員函數允許重載。
三、C++程式結構
一個完整的C++程式包括以下幾部分:
- ✓ —個主函數,可以調用其他函數,但不能被調用,也稱為主程式。
- ✓ 用戶定義的任意多個的類及全局函數。
- ✓ 全局說明。在所有函數和類定義之外的變數說明及函數原型。
- ✓ 註釋。
- ✓ 頭文件。
- 對於比較大的程式,根據主函數和各用戶定義的類及全局函數的功能及相互關係,可以把類及全局函數劃分為幾個程式文件,包括.cpp文件和.h文件。.cpp文件是源程式文件,.h文件是頭文件。
- 從邏輯關係上看,典型的C++程式的結構包括類的定義、類中成員函數的實現及主函數main。
四、Class 中的訪問許可權
- public(公有的): 使用它修飾的類的成員可以在程式的任何地方被訪問。
- private(私有的): 使用它修飾的類的成員僅能在本類內被訪問。
- protected(保護的): 它的作用介於public與private之間,使用它修飾的類的成員能在本類內及子類中被訪問。
- 私有類型的成員在類外是不能訪問的,通過公有函數訪問的效率比直接訪問的效率要低。為了權衡這兩方面的因素,C++提供了友元訪問方式。只有在類內和在友元函數內才可以訪問私有成員。
五、Class 的使用
1、構造函數
- 為了對對象進行初始化,C++提供了一種稱為構造函數的機制,用於對對象進行初始化,實際上是用來為成員變數賦初值的。
- 構造函數是類中的特殊成員函數,它屬於類的一部分。給出類定義時,由程式員編寫構造函數。如果程式員沒有編寫類的任何構造函數,則由系統自動添加一個不帶參數的構造函數。
- 聲明對象後,可以使用new運算符為對象進行初始化,此時調用的是對象所屬類的構造函數。構造函數的作用是完成對象的初始化工作,用來保證對象的初始狀態是確定的。在對象生成時,系統自動調用構造函數,用戶在程式中不會直接調用構造函數。
- 定義一個類時,需要為類定義相應的構造函數。構造函數的函數名與類名相同,沒有返回值。一個類的構造函數可以有多個,即構造函數允許重載。同一個類的多個構造函數的參數表一定不能完全相同。
- 當類中沒有定義任何構造函數時,系統會自動添加一個參數表為空、函數體也為空的構造函數,稱為預設構造函數。所以任何類都可以保證至少有一個構造函數。如果程式員在程式中已經定義了構造函數,則系統不會再添加預設構造函數。
- 在聲明類的構造函數時可以同時給出函數體,這樣的構造函數稱為內聯構造函數。也可以在類體外給出構造函數的定義。構造函數的聲明中,形參的個數可以為0,即參數表為空
構造函數的格式:
構造函數的聲明格式如下:類名(形參1, 形參2, …,形參n) 在類體外定義構造函數時通常有三種形式 //形式一: 類名::類名(形參1,形參2,…,形參n):x1(形參1), x2(形參2), …, xn(形參n){} //形式二: 類名::類名(形參1,形參2,…,形參n){ x1=形參1; x2=形參2; …… xn=形參n; } //形式三: 類名::類名(){ x1=初始化表達式1; x2=初始化表達式2; …… xn=初始化表達式n; }
初始化時機:定義類的成員函數、成員對象及友元函數時,均不調用類的構造函數。僅當定義類的對象時,才由系統自動調用類的構造函數
構造函數的使用:
- C++語言規定,創建類的任何對象時都一定會調用構造函數進行初始化。對象需要占據記憶體空間,生成對象時,為對象分配的這段記憶體空間的初始化由構造函數完成。
- 數組:特別地,如果程式中聲明瞭對象數組,即數組的每個元素都是一個對象,則一定要為對象所屬的這個類定義一個無參的構造函數。因為數組中每個元素都需要調用無參的構造函數進行初始化,所以必須要有一個不帶參數的構造函數。
class Person{ private: int id; string name; public: Person(); Person(int id,string name); ~Person(); void setName(string name); string getName(); void setId(int id); int getId(); static void print(Person *person){ cout<< "id:" << person->id << " name:" << person->name <<endl; delete person; } }; Person::Person(){ cout<<"無慘構造函數" <<endl; } Person::Person(int id,string name){ this->id=id; this->name=name; cout << "有2個參數的構造函數" <<endl; } int main(){ Person pe(); Person pe2=Person(1,"張三"); }
1、使用new關鍵字
用new創建對象時返回的是一個對象指針,這個指針指向本類剛創建的這個對象。C++分配給指針的僅僅是存儲指針值的空間,而對象所占用的空間分配在堆上。使用new創建的對象,必須用delete來撤銷。
//4、類名 *對象指針名 = new 類名; Student *stu4=new Student(3,'D'); cout<< stu4->getName() <<endl;
類名 &對象引用名 = 對象;
Student stu3=Student(3,'C'); Student &str4=stu3; cout << str4.getName()<<endl;
類名 *對象指針名 = 對象的地址;
Student stu3=Student(3,'C'); Student *str4=&stu3; cout << str4->getName()<<endl;
類名 對象數組名[數組大小];
Student stu3[10]; Student stu4=Student(3,'C'); stu3[0]=stu4;
同類型的對象之間可以相互賦值。對象和對象指針都可以用作函數參數。函數的返回值可以是對象或指向對象的指針。