標籤:lib mem 類的建構函式 pac 多維陣列 poi 自動調用 gety 字元
這種在程式運行過程中申請和釋放的儲存單元也稱為堆對象,申請和釋放過程過程一般稱為建立和刪除。
1、new運算和delete運算
運算子new的功能是動態分配記憶體,或者稱為動態建立堆對象,文法形式為:
new 類型名T(初值列表);//用於申請分配存放T類型資料的記憶體空間,並使用初值列表中給出的值進行初始化。
如果建立的對象是一個基本類型變數,初始化過程就是賦值,如:
int *point;
point =new int(2);
動態分配了用於存放int類型資料的記憶體空間,並將初值2存入該空間中,然後將首地址賦給指標point。
如果建立的對象時某一個類的執行個體對象,就是要根據實際情況調用該類的建構函式。
運算子delete用來刪除由new建立的對象,釋放指標所指向的記憶體空間。格式為:
delete 指標名;
如果刪除的是對象,該對象的解構函式將被調用。對於用new建立的對象,只能使用delete進行一次刪除操作,如果對同一記憶體空間多次使用delete進行刪除將會導致運行錯誤。
#include<iostream>
using namespace std;
class Point
{
public:
Point()
{X=Y=0;cout<<"Default Constructor called."<<endl;}
Point(int xx,int yy){X=xx;Y=yy;cout<<"Constructor called."<<endl;}//建構函式
~Point()
{cout<<"Destructor called."<<endl;}
int GetX(){return X;}
int GetY(){return Y;}
void Move(int x,int y)
{X=x;Y=y;}
private:
int X,Y;
};
int main()
{
cout<<"Step One:"<<endl;
Point *Ptrl=new Point;//動態建立對象,沒有給出初值,因此調用預設的建構函式
delete Ptrl;//刪除對象,自動調用解構函式
cout<<"Step Two:"<<endl;
Ptrl=new Point(1,2);//動態建立對象,並給出初值,因此調用有形參的建構函式
delete Ptrl;//刪除對象,自動調用解構函式
getchar();
}
使用運算子new也可以建立數群組類型的對象,這時,需要給出數組的結構說明,用new運算子動態建立一維數組的文法形式為:
new 類型名T{下標運算式}
其中下標運算式之處數組元素的個數,動態為數組分配記憶體時不能指定數組元素的初值。注意,如果是用new建立的數組,用delete刪除時在指標名前面要加"[]",如
#include<iostream>
using namespace std;
class Point
{
//類的定義
};
int main()
{
Point *Ptr=new Point[2];//建立對象數組
Ptr[0].Move(5,10);//通過指標訪問數組元素的成員
Ptr[1].Move(15,20);//通過指標訪問數組元素的成員
cout<<"Deleting ..."<<endl;
delete[] Ptr;//刪除整個對象數組
}
利用動態記憶體分配操作實現了數組的動態建立,使得數組元素的個數可以根據運行時的需要而確定。但是建立和刪除數組的過程使得程式略顯繁瑣,更好的方法是將數組的建立和刪除過程封裝起來,形成一個動態數組類。
eg:
#include<iostream>
using namespace std;
class Point
{
//類的定義
};
class ArrayOfPoints
{
public:
ArrayOfPoints(int n)
{numberOfPoints=n;points=new Point[n];}
~ArrayOfPoints()
{cout<<"Deleting..."<<endl;numberOfPoints=0;delete[] points;}
Point& Element(int n)
{return points[n];}
private:
Point *points;
int numberOfPoints;
};
int main()
{
int numbers;
cout<<"Please enter the number of points:";
cin>>number;
ArrayOfPoints points(number);//建立對象數組
points.Element(0).Move(5,10);//通過指標訪問數組元素的成員
points.Element(1).Move(15,20);//同上
}
在main函數中,只是建立一個ArrayOfPoints類的對象,對象的初始化參數number指定了數組元素的個數,建立和刪除對象數組的過程都由ArrayOfPoints類的建構函式和解構函式完成。
用new操作也可以建立多維陣列,形式如下:
new 類型名T[下標運算式1][下標運算式2]...;
eg:float *fp;
fp=new float[10][25][10];
會產生錯誤,因為這裡new操作產生的是指向一個25x10的二維float類型數組的指標。應該改為:
float (*cp)[25][10];
cp =new float[10][25][10];
2、動態記憶體分配與釋放函數
a、動態儲存裝置分配函數
原型:void *malloc(size);
參數:size是欲分配的位元組數
傳回值:成功,則返回void型智者;失敗,則返回null 指標。
標頭檔:<stdlib.h>和<malloc.h>
b、動態記憶體釋放函數
原型:void free(void *memblock);
參數:memblock是指標,指向需要釋放的記憶體。
傳回值:無
標頭檔:<stdlib.h>和<malloc.h>
4-數組、指標與字串1.4-動態記憶體分配