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!