這一章開始進入真正OOP的世界,剛剛接到期末考試通知心裏很慌,發現自己好多東西還沒學會,趁晚上睡不着開始複習,希望這次考試考好(然後可以去看小鬼的演唱會)
- 回顧:
程序=算法+數據結構
程序=函數+數據
爲什麼控制和數據要分離,如果我們將其統一呢?
對象:對現實生活中對象的抽象,具有屬性和行爲,我們對具有相似屬性和行爲的對象進行抽象就形成了類,對象是類的實例
類:對一類對象的封裝,提供對外接口,隱藏內部細節,創建類時需要使用構造函數,刪除類時需要用到析構函數,還可以將類進行組合
面向對象程序
過程性編程和麪向對象編程
- 什麼是過程?什麼是面向對象?
如果我們要設計程序統計每個達琳的信息,當我是面向過程設計,我就會先考慮如何聯繫到每個鬼姐姐,如何獲取這些數據,以什麼樣的形式展示,然後再考慮需要有哪些數據,應該如何存放。面向對象就是考慮到每個鬼姐姐應該有哪些數據,如何使用,再考慮如何設計界面,如何獲取的問題,面向對象更符合我們解決問題的常規思路
😈
抽象,封裝,繼承,多態 - 抽象:具體問題→公共性質
找出本質特徵(類似於語文中的借代)然後針對這一特徵找出解決方法
- 代碼抽象:功能和行爲
- 數據抽象:屬性和狀態的抽象
如何實現抽象呢?類的聲明! - 什麼是類型?
在現實生活中我們會對事物進行分類,計算機中同樣如此,數據的分類(根據存儲方式,計算特點等)默認了對數據操作方法 - 類:對同一類對象的共同屬性和行爲進行概括,形成類,包括類的聲明和類方法定義,類聲明是藍圖,方法定義了細節
舉例:鐘錶
數據抽象int hour,int minute,int second
代碼抽象setTime(),showTime()
class Clock {
public:
void setTime(int newH, int newM, int newS);
void showTime();
private:
int hour, minute, second;
};
補充:什麼是接口?黑盒子內部我們不知道,我們只能通過外部的窗口直接使用他(如通過調用公共的函數等等)
- 封裝:將抽象的數據和代碼形成一個類
目的:增強安全性,使用者不必瞭解具體的細節,只需要通過訪問接口和特定的權限使用類的成員,通過類聲明中的{}實現
class Clock {
public://訪問權限
void setTime(int newH, int newM, int newS);//對外訪問接口
void showTime();
private://訪問權限
int hour, minute, second;
};
數據和行爲的聲明都叫做類的成員,通過修改類的成員,改變外部可訪問性,增強數據安全和類之間的相互關係
- 繼承 在已有類的基礎上進行擴展,有利於代碼重用
- 多態:同一名稱,不同的功能實現
類似於函數重載
類和對象
概述:同類型對象的集合,通過具體的對象實現類的功能。
起初使用函數抽象時,只是對行爲進行了抽象,類對行爲和數據都進行了抽象,抽象層次更高,更適合大型軟件開發
型和值的概念:型對值進行了限制,限制了運算和數據類型,說明數據類型包含了數據的屬性和對數據的操作
自定義類型實際上就是一種類
- 類的實例化
類
- 類的定義
class 類名稱
{
public:(外部接口)
private:
protected:
注意:只需要聲明函數原型,函數體在類外定義
類定義一般分爲說明部分和實現部分(實現部分是函數的定義)
- 類成員的訪問控制
①公有成員:任何外部成員都可訪問,是對外部的接口
②private:對外屏蔽,只允許本類中函數訪問,類外部函數不能訪問(可以通過某種方法進行授權,即可訪問),如果緊跟class聲明後面定義屬性和行爲,則默認爲private(一般內部數據都被定義爲私有類)
③protected(繼承部分介紹)
成員數據賦值
類內初始值
private: int hour=0, minute=0, second=0;
創建對象時,如果沒有構造函數,就會按照類內初始值的定義對對象相關的值進行賦值 - 類的成員函數:對類對象行爲的描述
1 成員函數的實現
原型聲明在類體中,函數定義在類之外,要指明類的名稱,也可以直接在類中給出,形成內聯函數。
void Class::setTime(){}
(需要用類名來限制函數)
2 目的對象:myClock::setTime();
3 也可以在類內給出函數體,形成內聯成員函數(簡單的函數)
4 允許重載函數和帶默認值的函數
#include<iostream>
using namespace std;
class Clock {
public:
void setTime(int newH = 0, int newM = 0, int newS = 0);
void showTime();
private:
int hour, minute, second;//該類的成員函數都可使用這些數據
};
void Clock::setTime(int newH, int newM, int newS) {
hour = newH;
minute = newM;
second = newS;
}
void Clock::showTime() {
cout << hour << ":" << minute << ":" << second;
}
int main() {
Clock myClock;
myClock.setTime(12, 36, 2);
myClock.showTime();
return 0;
}
5 內聯函數
隱式定義和顯式定義
對象:對現實對象的模擬
- 對象的定義
類名 對象名
Clock myClock;
2.類的成員間可以互相訪問
3.類外訪問類的成員,需要通過對象訪問
對象名.成員名
(僅限於public)
4.a=b;
實現對象b的屬性全部賦值給a
一般來說會選擇把數據類型的變量改爲private型,一般定義一個getNum的函數去訪問變量。
不要讓類太複雜,模塊化設計纔是宗旨
這篇先寫到這,隨後根據cpp增加內容