C/C++編程筆記:C++入門(mén)知識(shí)丨從結(jié)構(gòu)到類(lèi)的演變
先來(lái)看看本節(jié)知識(shí)的結(jié)構(gòu)圖吧!

接下來(lái)我們就逐步來(lái)看一下所有的知識(shí)點(diǎn):
結(jié)構(gòu)的演化
C++中的類(lèi)是從結(jié)構(gòu)演變而來(lái)的, 所以我們可以稱(chēng)C++為”帶類(lèi)的C”.
結(jié)構(gòu)發(fā)生質(zhì)的演變
C++結(jié)構(gòu)中可以定義函數(shù), 稱(chēng)之為成員函數(shù)
結(jié)構(gòu)定義格式, 像這樣:
struct 結(jié)構(gòu)名 {
? ? 數(shù)據(jù)成員;
? ? 成員函數(shù);
}; // 注意這里的分號(hào)不要忘記
具體的代碼, 像這樣:

:
模型圖是這樣的:

它表明: 我定義了一個(gè)結(jié)構(gòu)體, 有兩個(gè)私有的數(shù)據(jù)成員x, y, 兩個(gè)公有的成員函數(shù)setXY(double, x, double y), display();
在定義結(jié)構(gòu)體時(shí), 將數(shù)據(jù)成員使用private關(guān)鍵字修飾, 則產(chǎn)生封裝性. 如果沒(méi)有沒(méi)定, 則默認(rèn)為public
private修飾的數(shù)據(jù)成員為私有的數(shù)據(jù)成員, 必須公有的成員函數(shù)才能使用, 這就是數(shù)據(jù)的封裝性.
使用方式: 結(jié)構(gòu)對(duì)象.成員函數(shù)
我們?cè)趍ain函數(shù)中這樣使用:

注意:
如果結(jié)構(gòu)的數(shù)據(jù)成員用private關(guān)鍵字修飾
則不能這么訪問(wèn):?
cout << pointA.x << endl; count << pointA.y << endl;
如果public修飾, 則可以這么訪問(wèn).
不過(guò)我們一般為了保證封裝性, 將數(shù)據(jù)成員聲明為private, 保證只有成員函數(shù)才能訪問(wèn)。
使用構(gòu)造函數(shù)初始化結(jié)構(gòu)對(duì)象
函數(shù)名與結(jié)構(gòu)同名, 稱(chēng)為構(gòu)造函數(shù), 專(zhuān)門(mén)用于初始化結(jié)構(gòu)對(duì)象
分為有參構(gòu)造函數(shù)和無(wú)參構(gòu)造函數(shù)
像這樣:


模型圖是這樣的:

它表明: 我定義了一個(gè)結(jié)構(gòu)體, 有兩個(gè)私有的數(shù)據(jù)成員x, y, 一個(gè)無(wú)參構(gòu)造函數(shù)Point(), 一個(gè)有參構(gòu)造函數(shù)Point(double x, double y), 兩個(gè)普通的成員函數(shù)setXY(double, x, double y), display();
從結(jié)構(gòu)演變成一個(gè)簡(jiǎn)單的類(lèi)
使用關(guān)鍵字class代替stuct, 就將一個(gè)結(jié)構(gòu)演變成一個(gè)標(biāo)準(zhǔn)的類(lèi)啦! 是不是So easy!
像這樣:

好的, 從現(xiàn)在開(kāi)始把我們的目光從struct移開(kāi)吧, 讓我們聚焦于class!
面向過(guò)程與面向?qū)ο?/h1>
編程語(yǔ)言是我們和計(jì)算機(jī)交流的橋梁, 編程技術(shù)在發(fā)展, 同樣的編程語(yǔ)言也在發(fā)展, 編程語(yǔ)言從最初的0和1, 到匯編語(yǔ)言, 再到面向過(guò)程的語(yǔ)言, 再到面向?qū)ο蟮恼Z(yǔ)言, 反應(yīng)出了我們的編程思想也在不斷的進(jìn)步, 面向過(guò)程只是關(guān)注解決問(wèn)題的步驟, 而面向?qū)ο箨P(guān)注解決問(wèn)題的對(duì)象, 也就是誰(shuí)解決這個(gè)問(wèn)題.
下面我用兩個(gè)經(jīng)典的例子來(lái)詮釋面向過(guò)程和面向?qū)ο蟮膮^(qū)別
第一個(gè): 五子棋游戲
面向過(guò)程是這樣的:
(1)開(kāi)始游戲 -> (2)黑子下棋 -> (3)繪制畫(huà)面 -> (4)判斷輸贏 -> (5)白子下棋 -> (6)繪制畫(huà)面 -> (7)判斷輸贏 -> (8)返回步驟(2)
面向?qū)ο笫沁@樣的:
黑白雙方, 負(fù)責(zé)下棋這個(gè)操作
棋盤(pán)系統(tǒng), 負(fù)責(zé)繪制畫(huà)面
規(guī)則系統(tǒng), 負(fù)責(zé)判斷是否犯規(guī), 輸贏等
第二個(gè): 把大象裝進(jìn)冰箱
面向過(guò)程是這樣的:
(1)把冰箱門(mén)打開(kāi) -> (2)把大象裝進(jìn)去 -> (3)把冰箱門(mén)關(guān)上
面向?qū)ο笫沁@樣的:
冰箱 -> 開(kāi)門(mén)
冰箱 -> 裝大象
冰箱 -> 關(guān)門(mén)
冰箱是一個(gè)對(duì)象, 它有開(kāi)門(mén)的操作, 裝大象的操作, 關(guān)門(mén)的操作, 大象也是一個(gè)對(duì)象
總結(jié)
面向過(guò)程就是關(guān)注解決問(wèn)題的步驟, 像這樣: 第一步打開(kāi)冰箱門(mén), 第二步裝大象, 第三步關(guān)閉冰箱門(mén)
面向?qū)ο缶褪顷P(guān)注解決問(wèn)題的對(duì)象, 像冰箱, 它有開(kāi)門(mén)的方法, 裝大象的方法, 關(guān)門(mén)的方法
大家知道基本的區(qū)別和聯(lián)系就可以啦。
面向?qū)ο蟪绦蛟O(shè)計(jì)的特點(diǎn)
面向?qū)ο蟮某绦蛟O(shè)計(jì)具有抽象, 封裝, 繼承和多態(tài)性的特點(diǎn)
對(duì)象
對(duì)象是系統(tǒng)描述客觀事物的一個(gè)實(shí)體, 是構(gòu)成系統(tǒng)的基本單位
對(duì)象用對(duì)象名, 屬性(數(shù)據(jù)成員), 操作(功能函數(shù))三要素來(lái)描述
對(duì)象名: 用來(lái)標(biāo)識(shí)一個(gè)具體的對(duì)象. 如: zhangsan, lisi等
屬性: 這個(gè)對(duì)象的數(shù)據(jù)成員, 也就是特征, 如: 姓名, 年齡, 性別等
操作: 這個(gè)對(duì)象所具有的行為, 如: 吃飯, 睡覺(jué), 打豆豆等
像這樣:
我們有一個(gè)對(duì)象
對(duì)象名: zhangsan
數(shù)據(jù)成員: 姓名叫張三, 年齡18歲
成員函數(shù): 會(huì)吃飯, 能睡覺(jué), 還喜歡打豆豆

抽象和類(lèi)
比如我們還有一個(gè)學(xué)生對(duì)象叫李四

我們現(xiàn)在有兩個(gè)學(xué)生對(duì)象一個(gè)叫張三, 年齡18, 一個(gè)叫李四, 年齡20, 比如我們還有一個(gè)學(xué)生對(duì)象叫王五, 年齡22, 假如我們還有好多個(gè)學(xué)生.
都有姓名, 年齡的基本屬性, 也有吃飯, 睡覺(jué), 打豆豆的行為,
我們把這些對(duì)象的共同特征進(jìn)一步抽象出來(lái), 就形成了類(lèi)的概念
像這樣:

這是一個(gè)類(lèi)
類(lèi)名: Student
數(shù)據(jù)成員: name, age
成員函數(shù): eat(), sleep(), dadoudou()
我們用代碼表示是這樣的:

類(lèi)和對(duì)象的關(guān)系
類(lèi)相當(dāng)于模具
對(duì)象相當(dāng)于用模具所制造出來(lái)的東西
類(lèi)是具有相同的屬性和操作的一組對(duì)象的集合
對(duì)象是這些集合當(dāng)中的一個(gè)個(gè)體
這樣理解:
李四是一個(gè)學(xué)生 // 正確, 因?yàn)槔钏氖菍?duì)象, 而學(xué)生是類(lèi)
學(xué)生就是李四 // 錯(cuò)誤, 學(xué)生是一個(gè)群體, 怎么可能是單個(gè)個(gè)體呢
封裝
一個(gè)經(jīng)典的例子來(lái)加深我們的理解吧!
電視機(jī)把各種部件都裝在機(jī)箱里, 遙控器的所有部件也都裝在遙控器里, 我們通過(guò)遙控器操作電視機(jī), 而不是我們自己擺弄電視機(jī)的各個(gè)組件! 比如音量+, 音量-, 而不是咱們?nèi)ル娨暀C(jī)里擺弄線(xiàn)圈!
封裝性就是要求一個(gè)對(duì)象應(yīng)該具備明確的功能, 并具有接口以便和其它對(duì)象相互作用, 對(duì)象內(nèi)部的數(shù)據(jù)和代碼是受保護(hù)的, 外界不能訪問(wèn)它們, 只能對(duì)象對(duì)外提供的接口可以訪問(wèn)它們. 增加獨(dú)立, 自己的數(shù)據(jù)只能由自己來(lái)操作.
類(lèi)的封裝是通過(guò)定義的存取權(quán)限實(shí)現(xiàn)的, 分為private和public, 對(duì)象的外部只能訪問(wèn)對(duì)象的公有部分, 也就是public修飾的, 不能訪問(wèn)對(duì)象的私有部分, 也就是private修飾的.
繼承
繼承是一個(gè)類(lèi)可以獲得另一個(gè)類(lèi)的特性的機(jī)制
像這樣:
比如我們有”人”這個(gè)類(lèi), 它具有姓名, 年齡這兩個(gè)屬性, 吃飯這個(gè)行為
我們又有”老師”這個(gè)類(lèi), 繼承自”人”類(lèi), 所以它有繼承過(guò)來(lái)的"姓名", "年齡"屬性, 還有自己所獨(dú)有的"職工編號(hào)"屬性, 有繼承過(guò)來(lái)的"吃飯"行為, 還有自己所獨(dú)有的"講課"行為.
我們又有”學(xué)生”這個(gè)類(lèi), 繼承自”人”類(lèi), 所以它有繼承過(guò)來(lái)的"姓名", "年齡"屬性, 還有自己所獨(dú)有的"學(xué)號(hào)"屬性, 有繼承過(guò)來(lái)的"吃飯"行為, 還有自己所獨(dú)有的"聽(tīng)課"行為.
總結(jié):子類(lèi)只需定義它所特有的特征, 而共享父類(lèi)的特征
多態(tài)性
不同的對(duì)象可以調(diào)用相同名稱(chēng)的函數(shù), 但可導(dǎo)致完全不同的行為的現(xiàn)象稱(chēng)為多態(tài)性.
在C++中, 多態(tài)性分為兩種, 一種稱(chēng)為編譯時(shí)多態(tài), 另一種為運(yùn)行時(shí)多態(tài)
編譯時(shí)多態(tài):也就是函數(shù)重載. 是指同一個(gè)函數(shù)名可以對(duì)應(yīng)著多個(gè)函數(shù)的實(shí)現(xiàn), 具體調(diào)用哪個(gè)函數(shù)由參數(shù)個(gè)數(shù), 參數(shù)類(lèi)型等來(lái)決定
運(yùn)行時(shí)多態(tài):也就是虛函數(shù). 在定義了虛函數(shù)后, 可以在基類(lèi)的派生類(lèi)中對(duì)虛函數(shù)重新定義, 以實(shí)現(xiàn)所想要的功能
使用類(lèi)和對(duì)象
使用string對(duì)象
必須包含該類(lèi)的頭文件, #include <string>
?像這樣:String str = “RayLee”; // 等價(jià)于 String str(“RayLee”);
在字符串的末尾系統(tǒng)會(huì)加上’’\0”字符來(lái)表示字符串的結(jié)束, 但是在計(jì)算字符串長(zhǎng)度的時(shí)候不包含'\0'
像這樣:

String str2 = ‘A’; // 錯(cuò)誤, str2是字符串對(duì)象, 不能賦值為字符
我們可以把字符串看成是字符數(shù)組
所以我們可以這么使用:

字符串連接符號(hào) +
作用: 將兩個(gè)字符串或者字符串與字符拼接起來(lái)
像這樣:

使用string類(lèi)的典型成員函數(shù)

面向過(guò)程和面向?qū)ο蟛皇菍?duì)立的, 面向?qū)ο笫墙⒃诿嫦蜻^(guò)程的基礎(chǔ)上的, 它們是相互依存的, 面向過(guò)程關(guān)注于解決問(wèn)題的步驟, 而面向?qū)ο箨P(guān)注于解決問(wèn)題中出現(xiàn)的對(duì)象, 而對(duì)象中則封裝了解決問(wèn)題的步驟, 面向?qū)ο笫歉呒?jí)的語(yǔ)言, 但它是依賴(lài)于面向過(guò)程而存在的, 隨著計(jì)算機(jī)科學(xué)與技術(shù)的發(fā)展, 出現(xiàn)更高級(jí)的語(yǔ)言也說(shuō)不定呢?

另外,UP在主頁(yè)上傳了一些學(xué)習(xí)C/C++編程的視頻教程,有興趣或者正在學(xué)習(xí)的小伙伴一定要去看一看哦!會(huì)對(duì)你有幫助的~