C++知識點

  1. 聲明爲const 的數據成員不能出現任何可能改變成員的操作,如:
  • 常成員函數不能出現賦值語句不能調用非常成員函數。
  • 常對象只能調用常成員函數。
  • 類的常成員變量在構造函數中只能通過列表初始化的方式。
  1. 虛函數重新定義,函數返回類型,函數名,參數個數,參數類型,參數順興都必須與原函數一致。
  2. 函數重載,只有參數類型不同,或者參數個數不同,或者二者兼有,才能重載,返回值類型不算。
  3. 賦值兼容規則成立條件是派生類從其基類公有派生。
  4. 只有通過基類指針訪問虛函數纔是動態連編,獲得運行時的多態。
  5. 內聯函數不能是虛函數,虛函數在類內定義,編譯時仍將其看做非內聯的。
  6. 構造函數不可以爲虛函數,析構函數通常爲虛函數。因爲如果new一個派生類的無名對象賦值給基類的一個指針,當用delete運算符撤銷無名對象時,系統只能執行基類的析構函數,而不能執行派生類的析構函數
  7. 純虛函數:virtual void show()=0;
  8. 擁有一個或多個純虛函數的類爲抽象類,抽象類不可以聲明對象,可以聲明指針和引用
  9. 編譯時的多態通過 重載 模板 實現,運行時的多態通過 虛函數實現。
  10. 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位?還請高手賜教。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章