大家還記得上節(jié)課的“類是對象的抽象和概括,而對象是類的具體和實(shí)例”這句話嗎?學(xué)會類的定義之后,下一步就是對象的創(chuàng)建和使用了!
1. 對象的創(chuàng)建:
類就是包含函數(shù)的結(jié)構(gòu)體,是一種自定義數(shù)據(jù)類型,用它定義出來變量,就是對象,這就是所謂的“對象是類的具體和實(shí)例”,定義了一個這個類的對象,也可以說實(shí)例化了一個對象,就是這個意思!
而對象的使用,和結(jié)構(gòu)體的使用也一樣,都是主要訪問里面的成員,也都是用過.的方式來訪問,如:
Student A; A.num = 101; strcpy(A.name,"dotcpp"); A.score = 100; A.print();
需要注意的是,這里類中的成員變量都是聲明為public類型的,如果聲明為private類型,則在主函數(shù)中主要通過對象.變量的方式直接訪問的話就會被禁止報(bào)錯,原因private類型的變量是私有類型,不允許外部訪問。
對于想保護(hù)但又想控制的私有變量,我們通常將其聲明為private類型,然后同時定義一個public類型的專門賦值的方法,由于內(nèi)部成員可以訪問private聲明的變量,我們就可以在外部通過這個public的方法來間接控制這些私有的成員,來起到封裝、保護(hù)的效果,而這個public類型的方法,也稱之為這個類的一個外部接口。請大家理解這句話!
2. 對象的指針:
與普通變量一樣,對象也是一片連續(xù)的內(nèi)存空間,因此也可以創(chuàng)建一個指向?qū)ο蟮闹羔槪?strong>對象指針,存儲這個對象的地址。
那么創(chuàng)建方法與使用一般類型的指針類似,定義方法如下:
類名 *指針名;
如定義Student *p;定義一個Clock類型的指針p,需要清楚的是,這里并沒有建立對象,當(dāng)然也不會調(diào)用構(gòu)造函數(shù)。接下來就可以將一個同類型的類對象地址賦值給這個指針,然后通過->來訪問對象中的成員。
代碼如下:
Student *p; Student A; p = &A; p->print();
以上是對象指針的使用方法,除了在賦值、訪問成員的時候用以外,在傳參的時候也建議用指針來傳遞,因?yàn)槠鋫鬟f的為地址,不會進(jìn)行對象之間的副本賦值,從而減少內(nèi)存的開銷,提高效率。
3. 對象的引用:
引用,是C++中一種新的類型,對象引用就是一個類對象起個別名,本質(zhì)上也是把這個類對象的地址賦給了這個引用類型,兩者是指向一塊內(nèi)存空間的。那么如何定義使用?下面給大家展示。
Student A; Student &Aq=A;
如以上代碼,定義一個Student類型的對象,然后用&來定義一個該類類型的引用類型,并把A對象賦給Aq作為初始化。
需要注意的是:
1. 與指針一樣,兩者必須是同類型才可以引用。
2. 除非做函數(shù)的返回值或形參時,其余定義引用類型的同時就要初始化!
3. 引用類型并非是新建立一個對象,因此也不會調(diào)用構(gòu)造函數(shù)。
那么既然是類對象的別名,因此使用方法也和類對象一樣,用別名.成員的方法進(jìn)行訪問,如:
Student A; Student &Aq=A; Aq.print();
大家可以看到,用引用類型時,本質(zhì)還是存的地址,因此無論傳參定義都不會太多內(nèi)存開銷,有指針的優(yōu)勢,同時使用起來和類對象本身使用一樣,再做函數(shù)實(shí)參時,直接傳入引用對象就可以,不用加地址符,因此看起來更直觀、方便。這就是引用類型的優(yōu)點(diǎn)。
C語言網(wǎng)提供由在職研發(fā)工程師或ACM藍(lán)橋杯競賽優(yōu)秀選手錄制的視頻教程,并配有習(xí)題和答疑,點(diǎn)擊了解:
一點(diǎn)編程也不會寫的:零基礎(chǔ)C語言學(xué)練課程
解決困擾你多年的C語言疑難雜癥特性的C語言進(jìn)階課程
從零到寫出一個爬蟲的Python編程課程
只會語法寫不出代碼?手把手帶你寫100個編程真題的編程百練課程
信息學(xué)奧賽或C++選手的 必學(xué)C++課程
藍(lán)橋杯ACM、信息學(xué)奧賽的必學(xué)課程:算法競賽課入門課程
手把手講解近五年真題的藍(lán)橋杯輔導(dǎo)課程