c与c++遗漏点
c和c++部分知識點(diǎn):
###
i++ 與 ++i 區(qū)別
內(nèi)建數(shù)據(jù)類型,效率沒有區(qū)別;自定義數(shù)據(jù)類型的情況,++i效率較高,原因++i返回對象的引用,而i++返回對象的值,產(chǎn)生較大復(fù)制開銷。
i++操作符重載如下:
A operator++(int) {
??????? A temp(num);
??????? num++;
??????? return temp;
??? }
++i操作符重載如下:
A& operator++() {
??????? num++;
??????? return *this;
??? }
?
###??
空類編譯器會(huì)安插一個(gè)char,因此sizeof空類為1字節(jié);一個(gè)多重繼承兩個(gè)空類的空類依然為1字節(jié);虛繼承一個(gè)空類則子類有個(gè)指針指向基類,則大小為4字節(jié),虛繼承兩個(gè)空類則為8.
###
sizeof為操作符,編譯時(shí)處理,表示能容納最大字節(jié);strlen為函數(shù),運(yùn)行時(shí)表示字符串長度,并且不包括'\0'.
###
內(nèi)聯(lián)是以代碼膨脹為代價(jià)的,省去函數(shù)調(diào)用,提高效率,如果函數(shù)內(nèi)部運(yùn)行時(shí)間遠(yuǎn)大函數(shù)調(diào)用時(shí),則提高效率有限。
#33
常量指針,指向常量的指針;指針常量,首先是常量,再是指針,指針常量就是不能修改這個(gè)指針?biāo)赶虻牡刂?#xff0c;一開始初始化指向哪兒,就只能指哪兒,像數(shù)組名。
#33
char * const p1?;?//指針常量,自身不能修改,所指內(nèi)容可以被修改。
char const * p2 ; //
const char *p3 ;? // p2,p3都是常量指針,本身可以修改,所指內(nèi)容不能修改。
const char *const p4; // 本身是常量,并且所指內(nèi)容也不可被修改。
#33
class MyClass
{
public:
??? MyClass(int data)
??? {
??????? m_data = data;
??? }
??? void Print()
??? {
??????? //std::cout << m_data << std::endl;?//注釋掉此行,傳進(jìn)來的對象this指針實(shí)際上沒有任何用處,這樣的函數(shù)其特征與全局函數(shù)并沒有區(qū)別。
??????? std::cout << "hello!" << std::endl;
??? }
private:
??? int m_data;
};
int _tmain(int argc, _TCHAR* argv[])
{
??? MyClass *pMyClass = new MyClass(1);
??? pMyClass->Print();
??? pMyClass[0].Print();
??? pMyClass[1].Print();
??? pMyClass[10000].Print();
?return 0;
}
注掉結(jié)果:
hello!
hello!
hello!
hello!
開啟結(jié)果:
1
hello!
1
hello!
-33686019
hello!
訪問違規(guī)段錯(cuò)誤
#33
指針與句柄
指針指向一數(shù)據(jù)在內(nèi)存中的地址,windows并不希望一般程序修改其內(nèi)部數(shù)據(jù)結(jié)構(gòu),這不安全,所以windows給每個(gè)使用GlobalAlloc等函數(shù)聲明的內(nèi)存區(qū)域指定一個(gè)句柄,句柄是一種指向指針的指針。
句柄所指的可以是一個(gè)很復(fù)雜的結(jié)構(gòu),并且很有可能是與系統(tǒng)有關(guān)的,這個(gè)句柄的某一項(xiàng)是與系統(tǒng)進(jìn)行交互的。
指針也可以指向一個(gè)復(fù)雜的結(jié)構(gòu),但是通常是由用戶定義的。
#33
const_cast:?去掉const限制
dynamic_cast: 判斷在運(yùn)行是所指向?qū)ο蟮拇_切類型,限于對象指針的類型轉(zhuǎn)換,而非對象變量。
reinterpret_cast: 將一個(gè)指針轉(zhuǎn)換成其他類型的指針;
static_cast: 它能在相關(guān)的對象和指針類型之間進(jìn)行類型轉(zhuǎn)換。
#33
A a;?//聲明一個(gè)無參對象不能用A a();
#33
覆蓋,重寫,重載,隱藏,多態(tài)
首先,覆蓋也稱重寫,英文override
? 特點(diǎn):
1. 指不同作用域中(派生類和基類)同名函數(shù)的定義 2. 函數(shù)名、參數(shù)均完全相同 3. 基類對應(yīng)方法前有 virtual,即被聲明為虛函數(shù)
作用:
? 基類指針和引用在調(diào)用對應(yīng)方法時(shí),根據(jù)所指對象類型實(shí)現(xiàn)動(dòng)態(tài)綁定。
? 其次,重載(overload)
? 特點(diǎn):
? 1. 作用域,同一類中 2. 函數(shù)名相同,但是參數(shù)類型、個(gè)數(shù)等不完全相同
? 作用:
? 同一方法,根據(jù)傳遞消息的不同(類型或個(gè)數(shù)),產(chǎn)生不同的動(dòng)作(相同方法名,實(shí)現(xiàn)不同)。
? 隱藏(遮蔽)
? 特點(diǎn):
? 不同作用域,基類和派生之間
? 分兩種情形:
? 一、 基類和派生類函數(shù)名相同,但是參數(shù)列表不同,不同有無virtual,基類函數(shù)在派生類中被隱藏,派生類只能調(diào)用新的方法,不能調(diào)用已被隱藏的基類方法(不同于重載,作用域不同)
? 二、 基類與派生類同名,同參,但基類函數(shù)無virtual,同樣派生類中同樣隱藏基類的同名同參函數(shù)(不同于覆蓋,無virtual)
#33
模板會(huì)導(dǎo)致代碼膨脹,即二進(jìn)制代碼臃腫而松散,會(huì)嚴(yán)重影響程序的運(yùn)行效率。解決方法是把與參數(shù)無關(guān)的代碼分離出來。
?
?
總結(jié)