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