- 聲明爲const 的數據成員不能出現任何可能改變成員的操作,如:
- 常成員函數不能出現賦值語句不能調用非常成員函數。
- 常對象只能調用常成員函數。
- 類的常成員變量在構造函數中只能通過列表初始化的方式。
- 虛函數重新定義,函數返回類型,函數名,參數個數,參數類型,參數順興都必須與原函數一致。
- 函數重載,只有參數類型不同,或者參數個數不同,或者二者兼有,才能重載,返回值類型不算。
- 賦值兼容規則成立條件是派生類從其基類公有派生。
- 只有通過基類指針訪問虛函數纔是動態連編,獲得運行時的多態。
- 內聯函數不能是虛函數,虛函數在類內定義,編譯時仍將其看做非內聯的。
- 構造函數不可以爲虛函數,析構函數通常爲虛函數。因爲如果new一個派生類的無名對象賦值給基類的一個指針,當用delete運算符撤銷無名對象時,系統只能執行基類的析構函數,而不能執行派生類的析構函數
- 純虛函數:virtual void show()=0;
- 擁有一個或多個純虛函數的類爲抽象類,抽象類不可以聲明對象,可以聲明指針和引用
- 編譯時的多態通過 重載 模板 實現,運行時的多態通過 虛函數實現。
- reinterpret_cast用在任意指針(或引用)類型之間的轉換;以及指針與足夠大的整數類型之間的轉換;從整數類型(包括枚舉類型)到指針類型,無視大小。(相同bit位)
char str[] = "glad to test something";
char *p = str;
p++;
int *p1 = reinterpret_cast<int *>(p);
p1++;
p = reinterpret_cast<char *>(p1);
printf("result is %s\n", p);//result is to test something
class CTest
{
public:
CTest():m_chData(‘\0’),m_nData(0){ }
virtual void mem_fun() {} private:
char m_chData;
int m_nData;
static char s_chData;
};
char CTest::s_chData=’\0’;
32位操作系統
(1)若按4字節對齊sizeof(CTest)的值是多少? 12
(2)若按1字節對齊sizeof(CTest)的值是多少? 4
類佔的內存空間:
- 空類佔一個字節
- 非空類計算包括:變量,虛函數創建的虛表指針 。static不算,也沒有空類佔用的那一個字節。
方法重載(overload):
- 必須是同一個類
- 方法名(也可以叫函數)一樣
- 參數類型不一樣或參數數量不一樣
方法的重寫(override)兩同兩小一大原則: - 方法名相同,參數類型相同
- 子類返回類型小於等於父類方法返回類型,
- 子類拋出異常小於等於父類方法拋出異常,
- 子類訪問權限大於等於父類方法訪問權限
char a[]={0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8};
short* st=(short*) a;
int* it=(int *) a;
long long* ll=(long long *) a;
printf("%x\n%x\n%x\n", *st, *it, *ll);
這個代碼的輸出應該是?
答案是:
201
4030201
4030201
首先解釋short, short佔兩個字節,所以指針指向兩個字節,但是可能就好奇爲什麼是201不是102
這就涉及彙編字的傳送 , 看下面這個彙編代碼
如果0x1在10000H, 那麼0x2在10001H, 所以0x2在高八位,0x1在低八位,即0000 0010 0000 0001 ,所以爲201
int 同理,但是不明白long long 只取4位?還請高手賜教。