本周學(xué)習(xí)內(nèi)容回顧
轉(zhuǎn)換函數(shù)
conversion function
non-explicit-one-argument ctor
兩者都用于實(shí)現(xiàn)對(duì)象類型轉(zhuǎn)換
當(dāng)conversion function和non-explicit-one-argument ctor同時(shí)存在時(shí)會(huì)引發(fā)ambiguous調(diào)用錯(cuò)誤
而顯示的explicit-one-argument cotr與conversion function共存時(shí)需要顯式調(diào)用構(gòu)造函數(shù)之后才可以得到期望的結(jié)果
pointer-like class
智能指針
智能指針是一個(gè)模板類嘁捷,內(nèi)含一根真正的指針
智能指針重載operator*()和operator->()
對(duì)于*運(yùn)算符運(yùn)算會(huì)消耗掉*
對(duì)于->運(yùn)算符運(yùn)算會(huì)將結(jié)果繼續(xù)加上->
迭代器
list<Foo>::iterator ite;
*ite獲得一個(gè) Foo object
ite->method;意思是調(diào)用Foo::method()
相當(dāng)于(*ite).method();
相當(dāng)于(&(*ite))->method();
function-like class
functor
標(biāo)準(zhǔn)庫(kù)中仿函數(shù)使用一個(gè)奇特的base_class
namespace
不同命名空間互相獨(dú)立
用于解決不同部門或者不同個(gè)人之間防止出現(xiàn)函數(shù)重名或者全局變量重名所造成的二義性問題
class template,類模板
function template 函數(shù)模板
member template 成員模板
specialization 模板特化
partial specialization 模板偏特化
個(gè)數(shù)的偏特化
范圍的偏特化
template template parameter 模板模板參數(shù)
關(guān)于C++標(biāo)準(zhǔn)庫(kù)
由仿函數(shù)functors形成算法庫(kù)algorithm
容器container通過迭代器iterator調(diào)用algorithm中的方法實(shí)現(xiàn)各種運(yùn)算
C++11的三個(gè)新特性介紹
varadic templates
數(shù)量不定的模板參數(shù)
關(guān)鍵字...就是一個(gè)所謂的pack(包)
在varadic tempaltes中 sizeof...(args)獲得參數(shù)的個(gè)數(shù)
auto
兩種不可應(yīng)用auto關(guān)鍵字的情況:
1.coder本身對(duì)變量類型并不明確
2.直接用auto聲明一個(gè)變量但是并沒有賦值或者初始化的過程
ranged-base for loop
語法:for(decl: coll) {statement;}
通過值傳遞?
for(auto elem: vec) { ...;}
按引用傳遞
for(auto& elem: vec) {...;}
關(guān)于reference的理解
object和其reference大小相同跨蟹,地址相同(當(dāng)然這是假象)现使,另java語言中所有的變量都是reference
基于這個(gè)假象弦赖,所以reference與object相比在被調(diào)用端的寫法和調(diào)用端的接口均相同
因此reference通常不用于聲明變量,而是用于參數(shù)類型和返回值類型的描述
函數(shù)簽名包括 函數(shù)名、參數(shù)表斋日、以及()后面有可能存在的const關(guān)鍵字
復(fù)合&繼承關(guān)系下的構(gòu)造和析構(gòu)
構(gòu)造:
先調(diào)用基類的默認(rèn)構(gòu)造函數(shù)
然后調(diào)用component的默認(rèn)構(gòu)造函數(shù)
最后執(zhí)行自身的構(gòu)造
析構(gòu):
先析構(gòu)自身
然后析構(gòu)component
最后析構(gòu)基類
關(guān)于作業(yè)的思考
VS2008編譯器x64環(huán)境下的對(duì)象模型
Fruit對(duì)象的size為32字節(jié)Apple對(duì)象的size為40字節(jié)
編譯器將空類size為1字節(jié)只含有非虛函數(shù)的類size為1字節(jié)
含有虛函數(shù)不含數(shù)據(jù)的類大小為8字節(jié)
vptrsize為8字節(jié)
對(duì)象初始地址為71FCE8
int?no首地址為71FCF0
相對(duì)對(duì)象初始地址偏移量為8字節(jié)
vptr的size為8字節(jié)饰恕,占位8字節(jié)
double?weight首地址為71FCF8
相對(duì)no首地址偏移量為8字節(jié)
相對(duì)對(duì)象初始地址偏移量為16字節(jié)
int型變量size為4字節(jié)挠羔,但是計(jì)算得占位8字節(jié),故而填充量為4字節(jié)
char?key首地址為71FD00
相對(duì)weight首地址偏移量為8字節(jié)
相對(duì)對(duì)象初始地址偏移量為24字節(jié)
對(duì)象總size為32字節(jié)
double型變量size為8字節(jié)埋嵌,占位8字節(jié)
char型變量size為1字節(jié)
key首地址到Fruit結(jié)束之間的內(nèi)存空間為8字節(jié)破加,故而填充量為7字節(jié)
Apple對(duì)象size為40字節(jié),基類Fruit對(duì)象為32字節(jié)
由基類繼承而來的數(shù)據(jù)等同基類對(duì)象模型
Apple類自身首地址為71FD28
int?size首地址為71FD48
intsize相對(duì)Apple對(duì)象首地址偏移量為32字節(jié)雹嗦,等于基類Fruit所占內(nèi)存空間大小
char?types首地址為71FD4C
相對(duì)size首地址偏移量為4字節(jié)范舀,等于intsize所占的內(nèi)存空間大小
chartypes首地址相對(duì)Apple對(duì)象首地址偏移量為36字節(jié)合是,Apple大小為40字節(jié),計(jì)算得types占位4字節(jié)锭环,故而填充量為3字節(jié)
VS2008編譯器Win32環(huán)境下的對(duì)象模型
Fruit對(duì)象的size為32字節(jié)Apple對(duì)象的size為40字節(jié)
編譯器將空類size為1字節(jié)只含有非虛函數(shù)的類size為1字節(jié)
含有虛函數(shù)不含數(shù)據(jù)的類大小為4字節(jié)
vptrsize為4字節(jié)
對(duì)象初始地址為8FFC38
int?no首地址為8FFC40
相對(duì)對(duì)象初始地址偏移量為8字節(jié)
vptr的size為4字節(jié)聪全,占位8字節(jié),故而填充量為4字節(jié)
double?weight首地址為8FFC48
相對(duì)no首地址偏移量為8字節(jié)
相對(duì)對(duì)象初始地址偏移量為16字節(jié)
int型變量size為4字節(jié)辅辩,但是計(jì)算得占位8字節(jié)难礼,故而填充量為4字節(jié)
char?key首地址為8FFC50
相對(duì)weight首地址偏移量為8字節(jié)
相對(duì)對(duì)象初始地址偏移量為24字節(jié)
對(duì)象總size為32字節(jié)
double型變量size為8字節(jié),占位8字節(jié)
char型變量size為1字節(jié)
key首地址到Fruit結(jié)束之間的內(nèi)存空間為8字節(jié)玫锋,故而填充量為7字節(jié)
Apple對(duì)象size為40字節(jié)蛾茉,基類Fruit對(duì)象為32字節(jié)
由基類繼承而來的數(shù)據(jù)等同基類對(duì)象模型
Apple類自身首地址為8FFC08
int?size首地址為8FFC28
intsize相對(duì)Apple對(duì)象首地址偏移量為32字節(jié),等于基類Fruit所占內(nèi)存空間大小
char?types首地址為8FFC2C
相對(duì)size首地址偏移量為4字節(jié)景醇,等于intsize所占的內(nèi)存空間大小
chartypes首地址相對(duì)Apple對(duì)象首地址偏移量為36字節(jié)臀稚,Apple大小為40字節(jié),計(jì)算得types占位4字節(jié)三痰,故而填充量為3字節(jié)
相同代碼在GCC編譯器win32環(huán)境下執(zhí)行的結(jié)果如下
對(duì)于Fruit的對(duì)象模型
vptr大小為4字節(jié)
vptr到int no之間沒有填充
最后的char key 占1字節(jié)后被填充至8字節(jié)
對(duì)于Apple的對(duì)象模型
基類的char key本身占據(jù)1字節(jié)然后填充至8字節(jié)
但是衍生類的int size從char key偏移量4字節(jié)位置即開始填充
衍生類的char types占據(jù)1字節(jié)然后又重新填充至8字節(jié)
可能的原因是在GCC下衍生類的對(duì)象模型會(huì)占據(jù)一部分基類本身的填充空間吧寺?
表示不是很明白...