做爰小視頻網(wǎng)站鄭州網(wǎng)絡(luò)營銷哪個(gè)好
前言:
? c++其實(shí)顧名思義就是c語言的升級版,很多剛學(xué)c++的同學(xué)第一感覺就是比c語言難學(xué)很多,其實(shí)沒錯(cuò),c++里的知識更加難以理解可以說雜且抽象,光是類和對象,看起來容易,但想完全吃透,真的挺難,所以我打算用三篇博客一起歸納介紹一下c++中關(guān)于類和對象的所有知識點(diǎn)。
面向過程?面向?qū)ο?#xff1f;
c語言是一門面向過程的語言,關(guān)注過程。
c++是一門面向對象的語言,關(guān)注對象。
那究竟什么是對象?什么是過程呢?
舉個(gè)例子面向過程,我們洗衣服,一共有下面這些步驟:
?c語言就是關(guān)注過程,將這些過程一個(gè)一個(gè)用函數(shù)實(shí)現(xiàn)就能達(dá)到目的。
而c++注重對象比如送外賣,c++就關(guān)注商家 買家 騎手等對象,然后每個(gè)對象里面又要顯示他們的狀態(tài),比如騎手就有休息中,派送中,取餐中等,如下圖所示:
?類的定義:
? c++是兼容c語言的,所以在c++中完全可以像c一樣使用struct,同時(shí)c++將struct升級成了類,我們在類里面可以定義函數(shù),升級成類后又要兼容c,有點(diǎn)矛盾,所以加了一個(gè)新的關(guān)鍵字class,所以c++中一般用class來表示類,如下圖定義一個(gè)日期類:
?所以不難看出c語言的struct和class一個(gè)重要區(qū)別就是class可以在里面定義函數(shù),而且類的定義不必像struct一樣加上類型,類名就是類型。
訪問方法如下圖:
?其實(shí)光這樣是訪問不了函數(shù)的,接下來就需要我們的域作用限定符了。
域作用限定符:
c++提出了3種訪問限定符:
public修飾的成員可以在域外直接被訪問。
protected和private在域外不能直接被訪問。?
?至于protected和private的區(qū)別,在繼承中會體現(xiàn),這里沒什么區(qū)別。
如果沒有加訪問限定符就是默認(rèn)權(quán)限。
那么接下來又有一個(gè)struct和class的區(qū)別:
class中默認(rèn)私有。
struct中默認(rèn)公有。
訪問權(quán)限作用域從該訪問限定符出現(xiàn)到下一個(gè)訪問限定符出現(xiàn)結(jié)束(或者類結(jié)束)
如下圖設(shè)置訪問限定符:
?在c++的慣例中成員變量都設(shè)置為私有,成員函數(shù)都設(shè)置為公有,因?yàn)閼T例一般不要直接修改數(shù)據(jù),修改數(shù)據(jù)都要函數(shù)去做,當(dāng)然如果有某些函數(shù)你只希望在類里面使用,也可以弄成私有的。
?類的聲明和定義分離:
? 當(dāng)一個(gè)類需要聲明和定義分離時(shí),不能按以前的方法,簡單的聲明定義分離,我們先來了解一下編譯器的搜索原則:先局部域再全局域
類會形成一個(gè)新的域叫類域。
?所以編譯器默認(rèn)不會去類域里面查找,所以就可能會出現(xiàn)定義找不到的情況,正確的聲明和定義分離如下圖:
頭文件:
.cpp定義文件:
?可以注意到此時(shí)需要在定義文件的函數(shù)名前面加上? ?域名::
這樣編譯器就會優(yōu)先去該域里面查找。
計(jì)算類的大小:
? 既然類中可以存放函數(shù)那么類的大小跟這些函數(shù)有關(guān)系嗎?函數(shù)的地址存放在類里面嗎?我們可以寫一個(gè)小案例測試一下。
注意成員變量的存放還是跟結(jié)構(gòu)體一樣遵循內(nèi)存對齊,不懂內(nèi)存對齊的可以看我的上一篇文章。
通過上面的測試不難看出,計(jì)算類的大小時(shí)沒有算Init函數(shù)的大小,說明成員函數(shù)的地址沒有存放在類里面,那它存放在哪里呢?
類的成員函數(shù)地址統(tǒng)一存放在一個(gè)公共區(qū)域(代碼段),避免空間浪費(fèi)。
寫個(gè)小案例證明一下上面的結(jié)論:
?我們把s1變成了空指針,但這里仍能進(jìn)行正常運(yùn)行,因?yàn)镻rint的地址在代碼段,沒在類里面,所以編譯器沒有對空指針的解引用,而是直接去代碼段找到了函數(shù)的地址。
冷知識:
如果沒有成員變量,只有成員函數(shù)又或者都沒有的情況,類的大小是多少呢?
這兩種的情況,類的大小都規(guī)定是1,因?yàn)槿绻稽c(diǎn)空間都不給,就無法證明這個(gè)類存在過。
this指針:
所有成員函數(shù)都i有一個(gè)隱含的this指針,它是成員函數(shù)的第一個(gè)參數(shù)。
該指針指向該對象,也就是說改類里的所有成員都可以通過this指針訪問。
舉個(gè)簡單的例子:
原本我們的類是這樣的:
?但當(dāng)編譯器翻譯過后就會先變成這樣:
注意我們不能顯示寫this,不然會報(bào)錯(cuò),和上圖一樣。
this指針被const了無法被修改,可以注意一下const的位置,補(bǔ)充一個(gè)小知識點(diǎn):
const在*前? 修飾指針指向的內(nèi)容
const在*后? 修飾指針本身
其實(shí)根據(jù)它的作用也可以判斷出,可以用過this指針修改指向的內(nèi)容,但不能修改指針本身。?
它在函數(shù)內(nèi)部是可以使用的,如下圖:
this指針特性總結(jié):
1.在形參和實(shí)參的位置我們不能顯示寫(別跟編譯器搶活)
2.它在函數(shù)內(nèi)部可以使用?
3.const了,無法修改指針本身
4.因?yàn)樗撬谐蓡T函數(shù)的第一個(gè)參數(shù),所有成員函數(shù)參數(shù)的個(gè)數(shù)永遠(yuǎn)都是n+1個(gè)
面試中this指針常考問題:
?1.this指針存在哪里?
在堆?棧?常量區(qū)?靜態(tài)區(qū)?對象里面?
首先對象里面肯定排除,因?yàn)槲覀儎偛庞?jì)算類的大小的時(shí)候通過測試,并沒有計(jì)算this指針的大小,所以排除對象里面。
再排除堆,因?yàn)橹挥衜alloc的空間才會在堆里面。
還可以排除靜態(tài)區(qū),因?yàn)橹挥衧tatic和全局變量才在靜態(tài)區(qū)。
繼續(xù)排除常量區(qū),因?yàn)樵赾++中const的變量不在常量區(qū)
所以正確答案:棧? 因?yàn)閠his指針是一個(gè)形參,而棧是用來存放? 函數(shù)的返回地址、形參、局部變量、返回類型的。
2.下面代碼的能正常運(yùn)行嗎?
正確答案是,程序奔潰,這里找到Print函數(shù)可以直接去代碼段找,但執(zhí)行該函數(shù)時(shí),需要訪問里面的_a,所以對s1進(jìn)行了訪問,而s1是空指針,這里出現(xiàn)了對空指針的解引用,所以程序奔潰。
類和對象上篇到此結(jié)束,中篇和下篇我會陸續(xù)發(fā)布,可以點(diǎn)我主頁查看,寶藏博主,還不關(guān)注,干貨滿滿,火速收藏!!!
?