在C++里,有两种方法创建对象:
方法一:
ClassName object(param);
這樣就聲明了一個(gè)ClassName類(lèi)型的object對(duì)象,C++會(huì)為它分配足夠的存放對(duì)象所有成員的存儲(chǔ)空間。
注意:為節(jié)省存儲(chǔ)空間,C++創(chuàng)建對(duì)象時(shí)僅分配用于保存數(shù)據(jù)成員的空間,而類(lèi)中定義的成員函數(shù)則被分配到存儲(chǔ)空間中的一個(gè)公用區(qū)域,由該類(lèi)的所有對(duì)象共享。
例如,我定義了一個(gè)這樣的類(lèi):
class Rec
{
? ?public:
? ?Rec(int width,int height);
? ?~Rec();
? ?int getArea();
? ?private:
? ?int Rwidth;
? ?int Rheight;
};
當(dāng)你Rec myRec(5,5);這樣創(chuàng)建一個(gè)myRec對(duì)象, 然后打印出sizeof(myRec);的時(shí)候,會(huì)得到 8 這個(gè)結(jié)果。
因?yàn)閙yRec中有2個(gè)int類(lèi)型的數(shù)據(jù)成員,一個(gè)int成員占4個(gè)字節(jié),所以myRec對(duì)象占8個(gè)字節(jié)。
這種方法創(chuàng)建的對(duì)象,內(nèi)存分配是分配到棧中的,由C++缺省創(chuàng)建和撤銷(xiāo),自動(dòng)調(diào)用構(gòu)造函數(shù)和析構(gòu)函數(shù)
注意:該方法創(chuàng)建的對(duì)象調(diào)用類(lèi)方法時(shí),必須用“.”,而不能用“->”.如myRec.getArea();
=============================================================================================
方法二:
ClassName *object=new ClassName(param);
delete object;
這種方法跟java有點(diǎn)類(lèi)似,相同的是,它們都是在堆上分配內(nèi)存來(lái)創(chuàng)建對(duì)象的(與上不同);不同的是,C++用new創(chuàng)建對(duì)象時(shí)返回的是一個(gè)對(duì)象指針,object指向一個(gè)ClassName的對(duì)象,C++分配給object的僅僅是存放指針值的空間。而且,用new 動(dòng)態(tài)創(chuàng)建的對(duì)象必須用delete來(lái)撤銷(xiāo)該對(duì)象。只有delete對(duì)象才會(huì)調(diào)用其析構(gòu)函數(shù)。
注意:new創(chuàng)建的對(duì)象不是用“*”或“.”來(lái)訪問(wèn)該對(duì)象的成員函數(shù)的,而是用運(yùn)算符“->”;
例如:Rec *rec=new Rec(3,4);
? ? ? rec->getArea();
? ? ? delete rec;
順便提一下:
一般來(lái)說(shuō),編譯器將內(nèi)存分為三部分:靜態(tài)存儲(chǔ)區(qū)域、棧、堆。靜態(tài)存儲(chǔ)區(qū)主要保存全局變量和靜態(tài)變量,棧存儲(chǔ)調(diào)用函數(shù)相關(guān)的變量、地址等,堆存儲(chǔ)動(dòng)態(tài)生成的變量。 在c中是指由malloc,free運(yùn)算產(chǎn)生釋放的存儲(chǔ)空間,在c++中就是指new和delete運(yùn)算符作用的存儲(chǔ)區(qū)域。
另外收集了兩種方法的優(yōu)點(diǎn):
new出來(lái)的在堆上,直接定義的在棧上,棧的大小有限制
new的好處:
1、需要的時(shí)候才new(在復(fù)雜權(quán)限和業(yè)務(wù)邏輯系統(tǒng)中很重要)
2、對(duì)象可靠性檢查(沒(méi)有??臻g的限制問(wèn)題)
3、對(duì)象的適度留用控制
總結(jié)
以上是生活随笔為你收集整理的在C++里,有两种方法创建对象:的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 子网/子网掩码原理简介
- 下一篇: 科目二、科目三易挂项目整理和网友支招