網(wǎng)站建設(shè)運(yùn)用軟件網(wǎng)站關(guān)鍵詞優(yōu)化推廣哪家快
學(xué)習(xí)本身就是一件很快樂(lè)的事情
一. 面向?qū)ο蠛兔嫦蜻^(guò)程?
我們?cè)趯W(xué)習(xí)計(jì)算機(jī)的過(guò)程中經(jīng)常會(huì)聽(tīng)到xxx是一門(mén)面向?qū)ο蟮恼Z(yǔ)言 xxx是一門(mén)面向過(guò)程的語(yǔ)言
那么到底什么是面向?qū)ο?什么是面向過(guò)程呢?
簡(jiǎn)單介紹下
面向過(guò)程
面向過(guò)程關(guān)注的是過(guò)程 分析出求解問(wèn)題的步驟,通過(guò)函數(shù)調(diào)用逐步解決問(wèn)題。
比如說(shuō)就拿洗衣服
我們關(guān)注的是洗衣服這個(gè)過(guò)程
就像這樣子
面向?qū)ο?
面向?qū)ο箨P(guān)注的是對(duì)象,將一件事情拆分成不同的對(duì)象,靠對(duì)象之間的交互完
成。
還是以洗衣服這個(gè)動(dòng)作來(lái)說(shuō)
?二. C++中類(lèi)的引入
?C語(yǔ)言結(jié)構(gòu)體中只能定義變量,在C++中,結(jié)構(gòu)體內(nèi)不僅可以定義變量,也可以定義函數(shù)。比如:
之前在數(shù)據(jù)結(jié)構(gòu)初階中,用C語(yǔ)言方式實(shí)現(xiàn)的棧,結(jié)構(gòu)體中只能定義變量;現(xiàn)在以C++方式實(shí)現(xiàn),會(huì)發(fā)現(xiàn)struct中也可以定義函數(shù)。
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<assert.h>
using namespace std;typedef int Datetype;struct Stack
{//定義變量類(lèi)型Datetype* _arr;int _top;int _capacity;//定義函數(shù)void StackInit(size_t capacity){_arr = (Datetype*)malloc(sizeof(Datetype)*capacity);if (_arr == nullptr){perror("Init malloc fail");}_capacity = capacity;_top = 0;}void StackPush(Datetype x){assert(_capacity > _top);_arr[_top] = x;_top++;}Datetype StackTop(){return _arr[_top-1];}void StackDestory(){_top = _capacity = 0;free(_arr);_arr = nullptr;}};
int main()
{Stack s;s.StackInit(20);s.StackPush(10);s.StackPush(10);s.StackPush(10);s.StackPush(20);cout << s.StackTop() << endl;s.StackPush(30);cout << s.StackTop() << endl;return 0;
}
我們定義了一個(gè)類(lèi) 然后使用這個(gè)類(lèi)創(chuàng)建了一個(gè)對(duì)象 之后使用這個(gè)類(lèi)的對(duì)象 使用一些方法
在Stack這個(gè)類(lèi)中 里面的變量是_arr _top _capacity
然后里面的這些方法 StackPush() StackInit() StackTop() 可以調(diào)用這些變量
此外 類(lèi)里面的函數(shù)和變量的上下關(guān)系是隨意的?
事實(shí)上 在C++當(dāng)中 這里并不是結(jié)構(gòu)體的定義 這是類(lèi)的封裝
在C語(yǔ)言的結(jié)構(gòu)體中,不會(huì)有函數(shù)這樣的成員變量,因?yàn)镃語(yǔ)言是面向過(guò)程的,其操作方式是與成員直接分開(kāi)的;
而C++是是面向?qū)ο蟮?#xff0c;一個(gè)對(duì)象就是包括了自身屬性和動(dòng)作。
一個(gè)對(duì)象中有很多的方法 方法就是函數(shù)
當(dāng)我們使用一個(gè)類(lèi)去定義的時(shí)候 我們就能夠得到一個(gè)對(duì)象 當(dāng)我們想要對(duì)這個(gè)對(duì)象進(jìn)行操作的時(shí)候我們就可以直接用內(nèi)部的方法進(jìn)行操作
上面結(jié)構(gòu)體的定義,在C++中更喜歡用class來(lái)代替。
三. 類(lèi)的定義?
我們會(huì)使用這樣子的結(jié)構(gòu)來(lái)定義一個(gè)類(lèi)
class className
{
// 類(lèi)體:由成員函數(shù)和成員變量組成
}; // 一定要注意后面的分號(hào)
其中class是一個(gè)關(guān)鍵字
classname是類(lèi)名
類(lèi)體中內(nèi)容稱(chēng)為類(lèi)的成員:類(lèi)中的變量稱(chēng)為類(lèi)的屬性或成員變量; 類(lèi)中的函數(shù)稱(chēng)為類(lèi)的方法或者
成員函數(shù)。
那么我現(xiàn)在問(wèn)你 成員變量是什么?
是不是就是類(lèi)中的變量
成員函數(shù)是什么?
是不是就是類(lèi)的函數(shù)
類(lèi)的兩種定義方式
1. 直接在函數(shù)內(nèi)部定義
就像這樣子
不過(guò)要注意的是 成員函數(shù)在類(lèi)的內(nèi)部定義有可能會(huì)被當(dāng)成內(nèi)聯(lián)函數(shù)
2. 在函數(shù)外部定義
就像這樣子
命名建議
我們先來(lái)看看這種命名方式
這個(gè)函數(shù)是不是很僵硬
class Data
{
public:void Init(int year){//這里的year到底是成員變量還是函數(shù)形參year = year;}
private:int year;
};
?所以說(shuō)我們的建議都是這樣子的
class Data
{
public:void Init(int year){//這里的year到底是成員變量還是函數(shù)形參mYear = year;}
private:int mYear;
};
加個(gè)m在前面或者是加個(gè)_在前面是不是清晰多了
四. 類(lèi)的訪問(wèn)限定符和封裝
4.1 訪問(wèn)限定符
C++實(shí)現(xiàn)封裝的方式:用類(lèi)將對(duì)象的屬性與方法結(jié)合在一塊,讓對(duì)象更加完善,通過(guò)訪問(wèn)權(quán)限選擇性的將其接口提供給外部的用戶(hù)使用。
這里分別由三種權(quán)限 分別是 公有 保護(hù) 還有私有
(目前階段 將保護(hù)還有私有認(rèn)為是一致的就可以)
聽(tīng)名字也很好理解是吧
公有是大家都能使用的 保護(hù)和私有是限制訪問(wèn)的
還是一樣 我們來(lái)看代碼
我們 struct 變成 class之后就報(bào)錯(cuò)了
這是為什么呢?
剛剛不是說(shuō)struct和class都可以定義類(lèi)嘛
這是因?yàn)閏++的一條語(yǔ)法規(guī)則
class的默認(rèn)訪問(wèn)權(quán)限為private,struct為public (這是為什么呢?)
因?yàn)閟truct要兼容c的語(yǔ)法 所以只能這么設(shè)計(jì)了
如果我們想要解決這個(gè)錯(cuò)誤也很簡(jiǎn)單 直接public一下就好了
是不是錯(cuò)誤就全部消失了
訪問(wèn)操作符的權(quán)限如下
1 public修飾的成員在類(lèi)外可以直接被訪問(wèn)
2 protected和private修飾的成員在類(lèi)外不能直接被訪問(wèn)(此處protected和private是類(lèi)似的)
3 訪問(wèn)權(quán)限作用域從該訪問(wèn)限定符出現(xiàn)的位置開(kāi)始直到下一個(gè)訪問(wèn)限定符出現(xiàn)時(shí)為止
4 如果后面沒(méi)有訪問(wèn)限定符,作用域就到 } 即類(lèi)結(jié)束。
5 class的默認(rèn)訪問(wèn)權(quán)限為private,struct為public(因?yàn)閟truct要兼容C)
4.2 關(guān)于域操作符的問(wèn)題
我們的先來(lái)看幾段有意思的代碼
咦 我們發(fā)現(xiàn)到這里就會(huì)報(bào)錯(cuò)了
這是因?yàn)?對(duì)于結(jié)構(gòu)體中的變量 它實(shí)際上是沒(méi)有初始化的
對(duì)于類(lèi)來(lái)說(shuō) 它是不是形式上類(lèi)似于一個(gè)結(jié)構(gòu)體呀
結(jié)構(gòu)體內(nèi)部的變量是不是沒(méi)有實(shí)例化
所以說(shuō)我們使用未實(shí)例化的變量是不是會(huì)報(bào)錯(cuò)啊
這里說(shuō)了這么一大堆要表達(dá)的東西是什么呢?
總結(jié)來(lái)說(shuō)一句話
不能使用類(lèi)名訪問(wèn)成員變量
面試題
C++中struct和class的區(qū)別是什么?
答案:
因?yàn)橐嫒輈語(yǔ)言的原因
struct可以定義結(jié)構(gòu)體
class不可以
還是因?yàn)橐嫒輈語(yǔ)言的原因
struct默認(rèn)訪問(wèn)限定符是public
class默認(rèn)訪問(wèn)限定符是private
4.3 封裝
【面試題】
面向?qū)ο蟮娜筇匦?#xff1a;封裝、繼承、多態(tài)。
在類(lèi)和對(duì)象階段,主要是研究類(lèi)的封裝特性,那什么是封裝呢?
封裝:將數(shù)據(jù)和操作數(shù)據(jù)的方法進(jìn)行有機(jī)結(jié)合,隱藏對(duì)象的屬性和實(shí)現(xiàn)細(xì)節(jié),僅對(duì)外公開(kāi)接口來(lái)和對(duì)象進(jìn)行交互。
封裝本質(zhì)上是一種管理,讓用戶(hù)更方便使用類(lèi)。比如:對(duì)于電腦這樣一個(gè)復(fù)雜的設(shè)備,提供給用戶(hù)的就只有開(kāi)關(guān)機(jī)鍵、通過(guò)鍵盤(pán)輸入,顯示器,USB插孔等,讓用戶(hù)和計(jì)算機(jī)進(jìn)行交互,完成日常事務(wù)。但實(shí)際上電腦真正工作的卻是CPU、顯卡、內(nèi)存等一些硬件元件。
對(duì)于計(jì)算機(jī)使用者而言,不用關(guān)心內(nèi)部核心部件,比如主板上線路是如何布局的,CPU內(nèi)部是如何設(shè)計(jì)的等,用戶(hù)只需要知道,怎么開(kāi)機(jī)、怎么通過(guò)鍵盤(pán)和鼠標(biāo)與計(jì)算機(jī)進(jìn)行交互即可。因此計(jì)算機(jī)廠商在出廠時(shí),在外部套上殼子,將內(nèi)部實(shí)現(xiàn)細(xì)節(jié)隱藏起來(lái),僅僅對(duì)外提供開(kāi)關(guān)機(jī)、鼠標(biāo)以及鍵盤(pán)插孔等,讓用戶(hù)可以與計(jì)算機(jī)進(jìn)行交互即可。
在C++語(yǔ)言中實(shí)現(xiàn)封裝,可以通過(guò)類(lèi)將數(shù)據(jù)以及操作數(shù)據(jù)的方法進(jìn)行有機(jī)結(jié)合,通過(guò)訪問(wèn)權(quán)限來(lái)隱藏對(duì)象內(nèi)部實(shí)現(xiàn)細(xì)節(jié),控制哪些方法可以在類(lèi)外部直接被使用。
五. 類(lèi)的作用域?
類(lèi)定義了一個(gè)新的作用域,類(lèi)的所有成員都在類(lèi)的作用域中。在類(lèi)體外定義成員時(shí),需要使用 ::作用域操作符指明成員屬于哪個(gè)類(lèi)域。
這個(gè)也很好理解嘛 其實(shí)我們回過(guò)頭去看看那些大括號(hào) 基本上都是定義了一個(gè)新的作用域
class Person
{
public:void PrintPersonInfo();
private:char _name[20];char _gender[3];int _age;
};
// 這里需要指定PrintPersonInfo是屬于Person這個(gè)類(lèi)域
void Person::PrintPersonInfo()
{cout << _name << " "<< _gender << " " << _age << endl;
}
六. 類(lèi)的實(shí)例化
用類(lèi)的類(lèi)型創(chuàng)建對(duì)象的過(guò)程叫做類(lèi)的實(shí)例化
1 類(lèi)是對(duì)對(duì)象進(jìn)行描述的,是一個(gè)模型一樣的東西,限定了類(lèi)有哪些成員,定義出一個(gè)類(lèi)并沒(méi)有分配實(shí)際的內(nèi)存空間來(lái)存儲(chǔ)它;
比如說(shuō):入學(xué)時(shí)填寫(xiě)的學(xué)生信息表,表格就可以看成是一個(gè)類(lèi),來(lái)描述具體學(xué)生信息。
2 一個(gè)類(lèi)可以實(shí)例化出多個(gè)對(duì)象,實(shí)例化出的對(duì)象 占用實(shí)際的物理空間,存儲(chǔ)類(lèi)成員變量
我們來(lái)看以下代碼
這里直接用類(lèi)調(diào)用成員會(huì)報(bào)錯(cuò)
必須要先創(chuàng)建一個(gè)實(shí)例
?3 做個(gè)比方。類(lèi)實(shí)例化出對(duì)象就像現(xiàn)實(shí)中使用建筑設(shè)計(jì)圖建造出房子,類(lèi)就像是設(shè)計(jì)圖,只設(shè)
計(jì)出需要什么東西,但是并沒(méi)有實(shí)體的建筑存在,同樣類(lèi)也只是一個(gè)設(shè)計(jì),實(shí)例化出的對(duì)象
才能實(shí)際存儲(chǔ)數(shù)據(jù),占用物理空間
?總結(jié)
較為詳細(xì)的介紹了類(lèi)和對(duì)象的一部分內(nèi)容
由于博主水平有限 錯(cuò)誤在所難免 希望大佬看到之后能夠不吝賜教