上C++的課程已經是兩年以前的事情了,從學習到現在教材也看了幾遍了,感覺基本知識應該都會了。昨天去參加一個筆試,可能也是長時間沒做題,C++也有一段時間沒有看了,好多題都拿不定主意,結果也是讓人很傷心。所以這兩天想再複習一下C++,並把原來沒掌握好的知識點記錄一下。

1.placement new 

       遇到它是因為看到網上有人想顯示的呼叫類的建構函式,如果直接呼叫,編譯不會通過,編譯器告知“不允許呼叫型別名”,編譯器把建構函式看成是一個型別。解決辦法有兩個:一個是用作用域運算子::來呼叫,另一個就是用placement new的方法,使用起來很簡單, 如下:

   MyClass * mc = new MyClass;
   new(mc)MyClass();
   delete mc;
       placement new 作用是該類的建構函式但是不分配記憶體,而是在已有的記憶體塊上面建立物件。用於需要反覆建立並刪除的物件上,可以降低分配釋放記憶體的效能消耗。比如:如果系統中某一個程式總是需要建立新的堆空間,執行時間長了記憶體會越來越小,不得不進行記憶體回收。使用placement new 而不是new就可以省去記憶體回收的時間。

    我想,在此處用

   new(mc)MyClass();

    是在mc指向的空間裡,顯示地定義了這個函式,就可以顯示呼叫了。

2.虛擬函式 純虛擬函式 虛基類

    基礎知識 不能花時間解釋了 必須掌握 繼承和多型是C++重點

3.static和const的作用

 static:1)修飾區域性變數和修飾全域性變數,都是限制作用域,並且被修飾的變數如果沒有被初始化就被初始化為0或‘\0’,並且下一次呼叫是維持上一次的值;

             2)修飾類的成員變數,該成員變數在這個類所實現的所有物件裡只有一個拷貝,呼叫時使用“類名::變數”;      

             3)修飾類的成員函式,該成員函式只能訪問static成員變數,不接收this指標

 const:1)修飾變數,該變數只能在初始化的時候被賦值,之後不能改變,該用法與預定義差不多,但與#define相   比,它可以定義變數型別;

             2)修飾類成員函式,則在該函式中不能有改變變數值的語句出現;

             3)修飾形式引數,則該形參在函式中不會被改變,例如複製建構函式中的形參;

             4)修飾指標,則該指標的值不能改變;修飾指標所指的值,則該指標的值可以變,但所指的值不能變;也可以同時修飾;

             5)修飾函式,使返回值不能做左值(如乘法運算子*,乘完就完了,做左值沒有意義(這一點從別人那裡看到的))

4.volatile

      1)一個引數可以同時被const和volatile修飾,比如對於一個只讀狀態儲存器,因為它可能會改變,防止改變後不能讀出正確的值,用volatile修飾;同時,程式又不能試圖去修改它,所以用const修飾;兩者不矛盾;

      2)一個指標可以是volatile的,比如中斷服務子程式中修改一個指向buffer的指標時,應該定義為volatile的;

      3)如下程式是有問題的

<span style="font-size:18px;">int square(volatile int * p){
       return *p * *p;
}</span>
會被編譯器理解為:
<span style="font-size:18px;">int square(volatile int *p){
    int a = *p;
    int b = *p;
    return a*b;
}</span>

對a、b賦值的時候可能會被中斷,a和b的值會不同。

5.C++中的引用和C中的指標的區別

    1)引用定義時必須初始化,並且不分配記憶體空間;而指標不用在定義時初始化,並且分配儲存空間;

    2)不能建立對空值的引用,但是可以建立指向空值的指標

6.