new運算符以及構造函數與析構函數

A *pa = new A[10];    //2014迅雷筆試

delete pa;
則類A的構造函數和析構函數分別執行了幾次()

A、1   1          B、10   10          C、1   10                D、10   1


new 和delete運算符用於動態分配和撤銷內存的運算符。

new用法:

          1.     開闢單變量地址空間

               2)int *a = new int(5) 作用同上,但是同時將整數賦值爲5

               1)new int;  //開闢一個存放數組的存儲空間,返回一個指向該存儲空間的地址.int *a = new int 即爲將一個int類型的地址賦值給整型指針a. 

          2.     開闢數組空間,當new分配一個數組時,並未得到一個數組類型的對象,而是得到一個數組元素類型的指針。

                 1) int * p=new int[get_size()];//方括號中的大小必須是整型,但不必是常量。

                 2)也可用一個數組類型的類型別名來分配一個數組,這樣,new表達式中就不必[].

                   typedef int arrT[42]//arrT表示42個int的數組類型

                   int *p=new arrT;//分配一個42個數組,p指向第一個int

                  例子:

                    int *p=new int[10]//10個未初始化的int

                    int *p1=new int[10]()//10個初始化爲0的int

delete用法:

          1. int *a = new int;

               delete a;   //釋放單個int的空間

          2.int *a = new int[5];

               delete [] a; //釋放int數組空間

要訪問new所開闢的結構體空間,無法直接通過變量名進行,只能通過賦值的指針進行訪問.


構造函數

          每個類分別定義了他的對象被初始化的方式,類通過一個或幾個特殊的成員函數來控制其對象的初始化過程,這些函數稱構造函數。無論何時只要類的對象被創建,就會執行構造函數。

           1)構造函數沒有返回類型。

           2)構造函數不能被聲明稱const的,當我們創建類的一個const對象時,直到構造函數完成初始化過程,對象才能真正取得“常量”屬性,因此,構造函數在const對象的構造過程中可以向其寫值。

            3)只有當類沒有聲明任何構造函數時,編譯器纔會自動生成默認構造函數。一旦我們定義了一些其他的構造函數,那麼除非再定義一個默認構造函數,否則將沒有默認構造函數。

          sale_data()=default//定義默認構造函數。

            4)構造函數的初始化值列表有時必不可少,例如如果成員是const或者引用,類似的,當成員屬於某種類型且該類型沒有定義默認構造函數時,也必須講這個成員初始化。

           class ConstRef

           {

                 public:

                          ConstRef(int ii)

                  private:

                        int i;

                        const int ci;

                        int &ri;

           };

           ConstRef::ConstRef(int ii)

            {

                  i=ii; //對

                 ci=ii;//錯,不能個const賦值

                 ri=i;//錯,ri沒有初始化;

            }

           正確的形式應爲:

                  ConstRef::ConstRef(int ii):i(ii),ci(ii),ri(i){}

           5)成員初始化順序。一般初始化的順序沒用什麼特別要求,但如果一個成員是用另一個成員來初始化的,那麼這兩個成員的初始化順序就很關鍵。

                  class X

                  {

                       int i;

                      int j;

                    public:

                          X(int val):j(val),i(j){}

                 }

          此例,從構造函數初始值的形式看好像先用val初始化了j,然後用j初始化了i。實際上,i先被初始化,因此這個初始值的效果是試圖使用未定義的值j初始化i!



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