怎么在類(lèi)中創(chuàng)建構(gòu)造函數(shù) 什么情況下用構(gòu)造函數(shù)法?
什么情況下用構(gòu)造函數(shù)法?有兩種情況,假設(shè)類(lèi)名是CTest,構(gòu)造函數(shù)是默認(rèn)構(gòu)造函數(shù)。一個(gè)是創(chuàng)建本地對(duì)象時(shí),CTest c;//此時(shí)會(huì)自動(dòng)調(diào)用構(gòu)造函數(shù)。一個(gè)是在堆上用new運(yùn)算符分配對(duì)象時(shí),CTest *
什么情況下用構(gòu)造函數(shù)法?
有兩種情況,假設(shè)類(lèi)名是CTest,構(gòu)造函數(shù)是默認(rèn)構(gòu)造函數(shù)。一個(gè)是創(chuàng)建本地對(duì)象時(shí),CTest c;//此時(shí)會(huì)自動(dòng)調(diào)用構(gòu)造函數(shù)。一個(gè)是在堆上用new運(yùn)算符分配對(duì)象時(shí),CTest * pnew CT
C new和delete是如何調(diào)用構(gòu)造函數(shù)和析構(gòu)函數(shù)的?
在C中,你可能經(jīng)常使用new和delete來(lái)動(dòng)態(tài)申請(qǐng)和釋放內(nèi)存,但是你有沒(méi)有想過(guò)下面這些問(wèn)題?
是新增和刪除功能。
新增[]和刪除[]是什么?你什么時(shí)候使用它們?
你知道運(yùn)算符new和運(yùn)算符delete嗎?
為什么new []中的數(shù)組有時(shí)會(huì)被delete釋放,有時(shí)不會(huì)?
…
如果你對(duì)這些問(wèn)題有什么疑問(wèn),不妨看看我的文章。
新增和刪除的到底是什么?
找工作的同學(xué)如果看一些面試的書(shū),相信都會(huì)遇到這樣的問(wèn)題:sizeof不是函數(shù),然后給出一堆理由證明sizeof不是函數(shù)。這里和sizeof一樣,new和delete不是函數(shù),是C定義的關(guān)鍵字,可以通過(guò)特定的語(yǔ)法形成表達(dá)式。與sizeof不同的是,sizeof可以在編譯時(shí)確定其返回值,new和delete背后的機(jī)制更加復(fù)雜。
在你繼續(xù)下去之前,請(qǐng)想一想你認(rèn)為new應(yīng)該做什么。可能你的第一反應(yīng)是new就像C語(yǔ)言中的malloc函數(shù)一樣,是用來(lái)動(dòng)態(tài)申請(qǐng)空間的。你答對(duì)了一半。請(qǐng)看下面的陳述:
string *ps新字符串(hello world)
可以看到new和malloc還是有點(diǎn)區(qū)別的。malloc在申請(qǐng)空間后不會(huì)初始化內(nèi)存,但是new可以。所以new expression背后你要做的事情并沒(méi)有你想的那么簡(jiǎn)單。在我用例子解釋new背后的機(jī)制之前,您需要知道什么是操作符new和操作符delete。
操作員新建和操作員刪除
這兩個(gè)其實(shí)是C語(yǔ)言標(biāo)準(zhǔn)庫(kù)的庫(kù)函數(shù),它們的原型如下:
void * operator new(size _ t)//分配一個(gè)對(duì)象
void *運(yùn)算符delete(void *)//釋放一個(gè)對(duì)象電休克療法
void * operator new[](size _ t)//分配一個(gè)數(shù)組
void *運(yùn)算符delete[](void *)//釋放數(shù)組
可以跳過(guò)后兩個(gè),以后再介紹。前兩個(gè)是C標(biāo)準(zhǔn)庫(kù)函數(shù)。你認(rèn)為這些是功能嗎?請(qǐng)不要。;t懷疑,這就是函數(shù)!在C Primer這本書(shū)里說(shuō)這不是new和delete的重載表達(dá)式(比如operator是重載運(yùn)算符),因?yàn)閚ew和delete的重載是不允許的。但是我沒(méi)有。;我不明白為什么我應(yīng)該使用操作符new和操作符delete,這很令人費(fèi)解。我們只需要知道它們的意思。這兩個(gè)函數(shù)有點(diǎn)像C語(yǔ)言中的malloc和free函數(shù),都是用來(lái)申請(qǐng)和釋放內(nèi)存的,而運(yùn)算符new在申請(qǐng)內(nèi)存后并不初始化內(nèi)存,而是直接返回申請(qǐng)內(nèi)存的指針。
我們可以在程序中直接使用這些函數(shù)。
新建和刪除背后的機(jī)制
知道了以上兩個(gè)函數(shù),我們用一個(gè)例子來(lái)解釋new和delete背后的機(jī)制:
我們不。;t使用簡(jiǎn)單的C內(nèi)置類(lèi)型作為示例,但是使用更復(fù)雜的類(lèi)類(lèi)型來(lái)定義類(lèi)A:
{
public:
:風(fēng)險(xiǎn)值
{
fopen_s(ampfile,測(cè)試