c++四種new:
int *p=new int//throw bad_alloc
int *p=new nothrow int;//nullptr,#include //必須使用new標頭檔案
const int *p=new const int(20); //不可修改值
int *p=new (buf) int(40);//定位new
point *p1 = new point();
point *p2 = new point(1, 1);
p1->show();
p2->show();
delete p1;
delete p2;
point *p3 = new point[4];//一般不用
point *p4 = new point[4];
p[0].show();
deletep3;
int *p=new int[100];這樣就開闢了400位元組的記憶體空間
int val=new int(10);//這個10表示的是值的大小,而不是開闢空間的大小
c++在new時的初始化的規律可能為:對於有建構函式的類,不論有沒有括號,都用建構函式進行初始化;如果沒有建構函式,
則不加括號的new只分配記憶體空間,不進行記憶體的初始化,而加了括號的new會在分配記憶體的同時初始化為0。
new會自動呼叫建構函式,而delete會自動呼叫析構函式
當我們使用new去動態開闢乙個物件時,需要我們手寫乙個delete()函式去釋放這個物件,
delete會呼叫析構函式再去釋放物件,如果把delete物件放到析構函式中是無法成功的,因為析構函式是由物件控制的
而物件這是是由new建立的,所以必須先delete。
淺拷貝:當類種存在new開闢空間的成員變數時,採用賦值運算和預設拷貝建構函式的方式進行拷貝操作都是淺拷貝
他們的問題都是因為淺拷貝導致由於對應的堆空間的指標存在兩份,那麼在釋放空間析構時同樣會析構兩邊
那麼程式就會出現錯誤
深拷貝就是解決了淺拷貝的問題的拷貝。
point::point(const point& ths)
禁止賦值拷貝操作:就是把拷貝和賦值的操作放到private中,那麼外部就無法定義了
class point
如果使用c11標準的話,做法為
class point
//注意這是成員函式的位置是public中
如果只能把初始化的物件放到堆中而不能在棧中:
class point
;void delete()
private:
~point(){};
}這樣因為,無法呼叫析構函式,所以無法在棧中建立物件
int main()
為了在main函式中呼叫delete函式釋放物件,但是析構函式在私有中,無法被外部呼叫,所以我們需要在public中
手動寫乙個delete函式賦值在外部進行釋放空間。delete()中的this指標會自動呼叫~point()析構函式。
拷貝和深淺拷貝
當list2為list的拷貝物件時,list內的可變資料型別變化,list2變化 list內的不可變資料型別變化,list2變化。總之 list變化list2一定變化 list 1,2,3,4,list2 list print list print list2 1,2,3,4,5 1,2,3,4,5...
堆與棧 物件深淺拷貝
js中的變數型別分為 值型別 基本型別 null undefined boolean string number 引用型別 array object 在js中,每乙個資料都需要乙個記憶體空間。記憶體空間又被分為兩種,棧記憶體 stack 與堆記憶體 heap var a 1 資料在棧記憶體中的儲存與...
toString 和深淺拷貝
在異常處理中,常用到乙個函式就是tostring 返回乙個string型別,描述異常的基本資訊。事實上,對於每個類都可以重寫tostring 函式,比如說,我們定義了乙個物件,student s 如果想以如下的格式system.out.println s 列印出我們想要的資訊,就必須重寫tostri...