一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

C++中定義類的對(duì)象:用new和不用new有何區(qū)別?

 clhon 2011-04-13
舉個(gè)簡(jiǎn)單的例子: class Point { private: int x; int y; public: void Set(int a,int b) { x=a; y=b; } void Print() { cout<<"("<<x<<","<<y<<")"<<endl; } }; void main() { Point p1; Point *p2=new Point(); p1.Set(1,2); p2->Set(4,5); p1.Print(); p2->Print(); delete p2; } 對(duì)象p1,p2的定義方式有何本質(zhì)不同?用哪種方式比較好?
最佳答案 
p1有系統(tǒng)創(chuàng)建并釋放,你不要擔(dān)心會(huì)出現(xiàn)內(nèi)存泄露,但是生命期只有在本區(qū)域的大括號(hào)內(nèi),出了大括號(hào)就沒用了。P2是指針,要自己釋放,用不好很危險(xiǎn),用好了功能強(qiáng)大,因?yàn)樗梢再x值給全局的變量,一下子從局部變量變成全局變量,還能把對(duì)象作為函數(shù)返回值。
------------------------------------------------
先定義一個(gè)類:
class A
{
public:
A();
virtual ~A();
...
...
};

類實(shí)現(xiàn)略。

用的時(shí)候:
A a;
a.成員函數(shù);
a.成員變量;
a 就是一個(gè)對(duì)象。


也可以這樣用:
A *a = new A;
a->成員函數(shù);
a->成員變量;
最后別忘了銷毀對(duì)象: delete[] a;

 

-----------------------------------------------

一個(gè)類的實(shí)例化對(duì)象所占空間的大???

 

注意不要說類的大小,是類的對(duì)象的大小.

首先,類的大小是什么?確切的說,類只是一個(gè)類型定義,它是沒有大小可言的。
用sizeof運(yùn)算符對(duì)一個(gè)類型名操作,得到的是具有該類型實(shí)體的大小。
如果
Class A;
A obj;
那么sizeof(A)==sizeof(obj)
那么sizeof(A)的大小和成員的大小總和是什么關(guān)系呢,很簡(jiǎn)單,一個(gè)對(duì)象的大小大于等于所有非靜態(tài)成員大小的總和。
為什么是大于等于而不是正好相等呢?超出的部分主要有以下兩方面:
1) C++對(duì)象模型本身
對(duì)于具有虛函數(shù)的類型來說,需要有一個(gè)方法為它的實(shí)體提供類型信息(RTTI)和虛函數(shù)入口,常見的方法是建立一個(gè)虛函數(shù)入口表,這個(gè)表可為相同類型的對(duì)象共享,因此對(duì)象中需要有一個(gè)指向虛函數(shù)表的指針,此外,為了支持RTTI,許多編譯器都把該類型信息放在虛函數(shù)表中。但是,是否必須采用這種實(shí)現(xiàn)方法,C++標(biāo)準(zhǔn)沒有規(guī)定,但是這幾戶是主流編譯器均采用的一種方案。
2) 編譯器優(yōu)化
因?yàn)閷?duì)于大多數(shù)CPU來說,CPU字長(zhǎng)的整數(shù)倍操作起來更快,因此對(duì)于這些成員加起來如果不夠這個(gè)整數(shù)倍,有可能編譯器會(huì)插入多余的內(nèi)容湊足這個(gè)整數(shù)倍,此外,有時(shí)候相鄰的成員之間也有可能因?yàn)檫@個(gè)目的被插入空白,這個(gè)叫做“補(bǔ)齊”(padding)。所以,C++標(biāo)準(zhǔn)緊緊規(guī)定成員的排列按照類定義的順序,但是不要求在存儲(chǔ)器中是緊密排列的。
基于上述兩點(diǎn),可以說用sizeof對(duì)類名操作,得到的結(jié)果是該類的對(duì)象在存儲(chǔ)器中所占據(jù)的字節(jié)大小,由于靜態(tài)成員變量不在對(duì)象中存儲(chǔ),因此這個(gè)結(jié)果等于各非靜態(tài)數(shù)據(jù)成員(不包括成員函數(shù))的總和加上編譯器額外增加的字節(jié)。后者依賴于不同的編譯器實(shí)現(xiàn),C++標(biāo)準(zhǔn)對(duì)此不做任何保證。

C++標(biāo)準(zhǔn)規(guī)定類的大小不為0,空類的大小為1,當(dāng)類不包含虛函數(shù)和非靜態(tài)數(shù)據(jù)成員時(shí),其對(duì)象大小也為1。

如果在類中聲明了虛函數(shù)(不管是1個(gè)還是多個(gè)),那么在實(shí)例化對(duì)象時(shí),編譯器會(huì)自動(dòng)在對(duì)象里安插一個(gè)指針指向虛函數(shù)表VTable,在32位機(jī)器上,一個(gè)對(duì)象會(huì)增加4個(gè)字節(jié)來存儲(chǔ)此指針,它是實(shí)現(xiàn)面向?qū)ο笾卸鄳B(tài)的關(guān)鍵。而虛函數(shù)本身和其他成員函數(shù)一樣,是不占用對(duì)象的空間的。

我們來看下面一個(gè)例子:(此例子在Visual C++編譯器中編譯運(yùn)行)

#include <iostream>
using namespace std;
class   
 
};  
class   
 
char   ch;  
void   func()  
 
 
};  
class   
 
char   ch1;    //占用1字節(jié)
char   ch2;   //占用1字節(jié)
virtual   void   func()  
 
 
};  
class   
 
int   in;  
virtual   void   func()  
 
 
};  
void   main()  
 
  a;
  b;
  c;
  d;
cout<<sizeof(a)<<endl;//result=1  
cout<<sizeof(b)<<endl;//result=1   //對(duì)象c擴(kuò)充為2個(gè)字,但是對(duì)象b為什么沒擴(kuò)充為1個(gè)字呢?大家?guī)兔鉀Q
cout<<sizeof(c)<<endl;//result=8  
//對(duì)象c實(shí)際上只有6字節(jié)有用數(shù)據(jù),但是按照上面第二點(diǎn)編譯器優(yōu)化,編譯器將此擴(kuò)展為兩個(gè)字,即8字節(jié)
cout<<sizeof(d)<<endl;//result=8  
 

綜上所述:

一個(gè)類中,虛函數(shù)、成員函數(shù)(包括靜態(tài)與非靜態(tài))和靜態(tài)數(shù)據(jù)成員都是不占用類對(duì)象的存儲(chǔ)空間的。

對(duì)象大小=   vptr(可能不止一個(gè))    所有非靜態(tài)數(shù)據(jù)成員大小    Aligin字節(jié)大?。ㄒ蕾囉诓煌木幾g器)

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多

    国产精品尹人香蕉综合网| 色婷婷日本视频在线观看| 国产免费一区二区三区不卡| 日本在线不卡高清欧美| 亚洲性生活一区二区三区| 中文字幕一区二区三区中文| 好骚国产99在线中文| 国产精品欧美日韩中文字幕| 国产精品福利一二三区| 亚洲第一视频少妇人妻系列| 日本午夜免费观看视频| 日韩熟妇人妻一区二区三区| 好吊色欧美一区二区三区顽频| 高中女厕偷拍一区二区三区| 午夜亚洲少妇福利诱惑| 亚洲国产成人一区二区在线观看| 在线视频三区日本精品| 日本午夜免费啪视频在线| 五月婷婷缴情七月丁香| 久久机热频这里只精品| 天海翼高清二区三区在线| 亚洲最新中文字幕在线视频| 91麻豆精品欧美视频| 中文字幕日韩欧美亚洲午夜| 国产乱淫av一区二区三区| 日韩国产中文在线视频| 亚洲综合伊人五月天中文| 国产一区一一一区麻豆| 91久久国产福利自产拍| 五月天丁香婷婷一区二区| 免费观看成人免费视频| 我的性感妹妹在线观看| 91后入中出内射在线| 久久精品久久精品中文字幕| 亚洲天堂国产精品久久精品| 精品女同一区二区三区| 中文字幕精品人妻一区| 欧美日韩成人在线一区| 亚洲欧美日韩另类第一页| 亚洲一二三四区免费视频| 国产亚洲神马午夜福利|