在c中有變數的生存週期,那麼在c++中就有物件的生存週期。
(1)普通物件的生存週期
若有乙個cobject類,屬性是姓名和年齡。
cobject gobject1;
int main()
cobject gobject2;
函式呼叫的先後順序是:
建構函式:gobject1
gobject2
object1
object2
先構造全域性後構造區域性。
析構函式:object2
object1
gobject2
gobject1
先構造的後析構。
在堆上開闢乙個物件,生存週期為從new到delete,如果沒有delete,則不會析構。
cobject("object",1);//生成乙個臨時物件(顯式生成)
(2)臨時物件的生存週期
int main()
①呼叫預設建構函式。
②呼叫帶兩個引數的建構函式,顯式構造。
③相當於賦值,呼叫帶兩個引數的建構函式,運算子過載函式。生成物件時不知道物件名會生成臨時物件,臨時物件的生存週期是呼叫的那句完後';'後立馬析構。
④相當於初始化,無臨時物件生成,因為系統進行了優化,以構造臨時量的方法構造了object3。
cobject object1=cobject("object1",2);
cobject object2;
object2=(cobject)("object",2);//生成臨時物件,呼叫帶乙個引數的建構函式 <=>object2=cobject(2)
呼叫的函式:
帶兩個引數的建構函式
不帶引數的建構函式
生成臨時物件(帶乙個引數的建構函式)
賦值運算子過載函式
析構掉臨時物件的函式
cobject *pobject=&cobject("pobject",1);//生成1個物件,呼叫乙個構造,乙個析構
cobject &pobject=cobject("pobject",1);//生成乙個臨時物件,呼叫乙個構造,無析構
引用乙個臨時物件,臨時物件的生存週期就變成了引用這個物件的生存週期。
cobject object1=cobject("object1",2);
cobject object2=(cobject)("object2",2);//隱式構造
object1=2;//隱式生成臨時物件,呼叫帶乙個引數的建構函式,賦值運算子過載函式,析構函式
cobject object2=2;//隱式構造,無臨時物件生成(系統進行優化)
若有:
void fun1(cobject rhs){}
void fun2(cobject &rhs){}
void fun3(cobject *rhs){}
在main函式裡進行如下操作:
cobject object1;
fun1(object1);//無參建構函式,拷貝建構函式(實參穿形參)
fun1(cobject("pobject",1));//帶兩個引數的建構函式
fun2(object1);
fun2(cobject("pobject",1));//引用乙個臨時物件
生存週期延長
fun3(&object1);//可使用
fun3(&cobject("pobject",1));//可訪問
臨時量產生的型別:
1、內建型別,產生的臨時量是常量
2、類型別,產生的臨時量是變數
3、隱式產生的臨時量也是常量
賦值運算子的過載函式:
1、修飾形參不能改變
2、接受隱式產生的臨時量
C 中物件生存週期
在c 中,我們所使用的的物件都有嚴格的生存週期。所謂的物件生存週期是指物件從建立開始到被釋放為止的時間。對於靜態記憶體中儲存的區域性static物件 類static資料成員以及定義在任何函式之外的變數,全域性物件 任何函式之外的物件 在程式啟動時分配,在程式結束時銷毀 對於區域性static物件 類...
c 類物件的生存週期
在這裡我們會通過乙個例子來給大家解釋說明 include using namespace std class test public test int a 5,int b 5 ma a mb b cout 1 因為物件t1處於全域性中,所以t1最先被構造,呼叫建構函式 2 由於物件t5 也處於全域性...
物件的生存週期
在學習析構函式時,了解到一般物件的銷毀是在main函式內return之後。在棧上構造的物件要符合棧的先進後出的規則。堆上new的物件需要遇到delete的時候才能銷毀,否則會出現記憶體洩漏。所以一般的物件生存週期為定義點開始,return之後main函式退出之前結束。對於特殊的物件,總結如下 1 全...