C++中类和对象的一些注意事项
1. struct和class的區(qū)別
默認(rèn)的訪問權(quán)限不同, struct默認(rèn)訪問權(quán)限是public, 而class的默認(rèn)訪問權(quán)限是private.
2. 構(gòu)造析構(gòu)函數(shù)
2.1 注意事項(xiàng)
- 匿名構(gòu)造函數(shù)在當(dāng)前行結(jié)束后, 系統(tǒng)會(huì)立即釋放其內(nèi)存占用.
- 不要用匿名拷貝構(gòu)造函數(shù).
- 創(chuàng)建一個(gè)類之后, 編譯器會(huì)自動(dòng)創(chuàng)建三個(gè)函數(shù), 默認(rèn)構(gòu)造函數(shù), 默認(rèn)析構(gòu)函數(shù), 拷貝構(gòu)造函數(shù). 如果我們提供有參構(gòu)造或者拷貝構(gòu)造函數(shù), 那么編譯器就不再提供默認(rèn)構(gòu)造.
- 當(dāng)其他類的對(duì)象作為本類成員時(shí), 先構(gòu)造其他類的對(duì)象, 再構(gòu)造本類對(duì)象. 析構(gòu)則是反過來.
- 構(gòu)造函數(shù)不能聲明為const,因?yàn)闃?gòu)造函數(shù)的意義在于初始化。
- 成員變量在使用初始化列表初始化時(shí),與構(gòu)造函數(shù)中初始化成員列表的順序無關(guān),只與定義成員變量的順序有關(guān)。
2.2 限定對(duì)象只能在堆/棧上創(chuàng)建
2.2.1 限定對(duì)象只能在堆上創(chuàng)建
錯(cuò)誤方法:
把構(gòu)造函數(shù)設(shè)為私有。但是這樣做,用new在堆上創(chuàng)建對(duì)象的時(shí)候也會(huì)調(diào)用構(gòu)造函數(shù),這樣就無法在外部調(diào)用類的構(gòu)造函數(shù)了。
方法1:
將析構(gòu)函數(shù)設(shè)為私有,因?yàn)閯?chuàng)建在棧上的對(duì)象是由編譯器分配和釋放內(nèi)存空間,編譯器為對(duì)象分配內(nèi)存空間時(shí),會(huì)對(duì)類的非靜態(tài)函數(shù)進(jìn)行檢查,即編譯器會(huì)檢查析構(gòu)函數(shù)的訪問性。當(dāng)析構(gòu)函數(shù)設(shè)為私有時(shí),編譯器創(chuàng)建的對(duì)象就無法通過訪問析構(gòu)函數(shù)來釋放對(duì)象的內(nèi)存空間,因此,編譯器不會(huì)在棧上為對(duì)象分配內(nèi)存。
方法1問題:
1. 將析構(gòu)函數(shù)設(shè)置為私有,調(diào)用delete刪除對(duì)象的時(shí)候,delete也需要調(diào)用析構(gòu)函數(shù),所以無法調(diào)用delete。需要多創(chuàng)建一個(gè)destroy()函數(shù)來釋放對(duì)象所占有的資源。
2. 將析構(gòu)函數(shù)設(shè)置為私有,那么當(dāng)此類作為基類時(shí),析構(gòu)函數(shù)需要設(shè)置為虛函數(shù),派生類無法訪問基類的構(gòu)造函數(shù),無法實(shí)現(xiàn)多態(tài)。
方法2:
針對(duì)方法1的問題,可以將構(gòu)造函數(shù)和析構(gòu)函數(shù)都設(shè)置為protected,并在類內(nèi)部用create(), destroy()函數(shù)創(chuàng)建和銷毀對(duì)象,這樣可以保證對(duì)象在堆創(chuàng)建,同時(shí)也能讓子類訪問析構(gòu)函數(shù)。
2.2.2 限定對(duì)象只能在棧上創(chuàng)建
可以將operator new設(shè)為私有,如以下代碼:
class A { private:void *operator new(size_t t) {} // 注意函數(shù)的第一個(gè)參數(shù)和返回值都是固定的void operator delete(void *ptr) {} // 重載了 new 就需要重載 delete public:A() {}~A() {} };3. 深拷貝和淺拷貝
- 拷貝構(gòu)造函數(shù)就是淺拷貝
- 深拷貝需要自己在拷貝構(gòu)造函數(shù)中實(shí)現(xiàn)
4. 靜態(tài)成員
4.1 靜態(tài)成員變量
所有對(duì)象都共享同一份數(shù)據(jù), 且編譯階段就分配了內(nèi)存(分配到了全局區(qū)). 類內(nèi)進(jìn)行聲明, 在類外進(jìn)行初始化.
4.2 靜態(tài)成員函數(shù)
靜態(tài)成員函數(shù)只能訪問靜態(tài)成員變量.
5. 類所占用的空間大小
- 類中只有類的非靜態(tài)數(shù)據(jù)成員占用類的對(duì)象的空間, 而靜態(tài)數(shù)據(jù)成員以及成員函數(shù)都是分開存儲(chǔ)的, 其所有對(duì)象都共享靜態(tài)數(shù)據(jù)成員以及成員函數(shù).
- 空類占用一個(gè)字節(jié), 為了區(qū)分對(duì)象.
- 由于類初始化對(duì)象之后, 對(duì)象中只存儲(chǔ)自身的非靜態(tài)數(shù)據(jù)成員, 而成員函數(shù)是分開存儲(chǔ)的, 對(duì)象調(diào)用自身成員函數(shù)時(shí)是將自身的this指針傳進(jìn)成員函數(shù)中, 便于其區(qū)分是哪個(gè)實(shí)例化的對(duì)象來調(diào)用, 所以當(dāng)有如下代碼時(shí):
6. const修飾
6.1 const修飾成員函數(shù)
const修飾成員函數(shù)叫做常函數(shù)(const放在形參列表后面, 本質(zhì)是把this指針修飾為其指向的對(duì)象的值不能修改), 其內(nèi)部不可以修改數(shù)據(jù)成員, 除非數(shù)據(jù)成員前面有mutable關(guān)鍵字, 那么常函數(shù)也能修改該成員.
6.2 const修飾對(duì)象
如果對(duì)象聲明的時(shí)候用const修飾(常對(duì)象), 那么該對(duì)象就只能調(diào)用成員函數(shù)中的常函數(shù). 其數(shù)據(jù)成員(未被mutable修飾)也不可以修改.
7. 友元
7.1 全局函數(shù)作友元
友元函數(shù)可以訪問類中的私有成員. 把函數(shù)在類前面聲明一下就可以.
7.2 類作友元
友元類可以訪問類中的私有成員. 把friend class +類名在被訪問的頭部聲明一下就可以.
7.3 類中成員函數(shù)作友元
8. 繼承
9.?多態(tài)
總結(jié)
以上是生活随笔為你收集整理的C++中类和对象的一些注意事项的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python车牌识别系统开源代码_天津谁
- 下一篇: C++数据的一些注意事项